#CameraX概要
Jetpackライブラリの1つで、既存のカメラAPIであるCamera2を元に作られている。
CameraXはCamera2の難点であった様々な端末のカメラの機能へのアクセスの複雑さを解消し、
シンプルに実装できるようになった。
※Android5.0(API21以上)で利用可能
#CameraXの構成
CameraXは以下の3つのユースケースを実装し、カメラ機能にアクセスできる。
この3つのユースケースはLifeCyleにbindすることにより使用でき、
bindしたLifeCycleにより破棄、再生成がされる。
###プレビュー
カメラ入力に対するプレビュー機能を提供する
val previewConfig = PreviewConfig.Builder().apply {
//どのカメラを使うか
setLensFacing(CameraX.LensFacing.BACK)
//解像度の設定
setTargetResolution(Size(1920, 1080))
//アスペクト比の設定
setTargetAsoectRatio(Rational(1920, 1080))
....
}.build()
val preview = Preview(previewConfig)
//ライフサイクルにbind
CameraX.bindToLifecycle(this as LifecycleOwner, preview)
解像度やアスペクト比を設定などが端末のスペックの範囲外の時は、
その端末で設定できる一番近しい値が自動で設定される。
###画像解析
画像解析用のバッファの設定をする。
画像解析用に必要なピクセルデータを送信することで画像解析のスピードを早くしている。
val imageAnalysisConfig = ImageAnalysisConfig.Builder().apply {
//どのカメラを使うか
setLensFacing(CameraX.LensFacing.BACK)
//解像度の設定
setTargetResolution(Size(1920, 1080))
//アスペクト比の設定
setTargetAsoectRatio(Rational(1920, 1080))
}.build()
val imageAnalyzer = ImageAnalysis(imageAnalysisConfig).apply {
//解析コード
}
//ライフサイクルにbind
CameraX.bindToLifecycle(this, imageAnalyzer)
###画像キャプチャ
画像の保存の設定をする。
val imageCaptureConfig = ImageCaptureConfig.Builder().apply {
//どのカメラを使うか
setLensFacing(CameraX.LensFacing.BACK)
//解像度の設定
setTargetResolution(Size(1920, 1080))
//アスペクト比の設定
setTargetAsoectRatio(Rational(1920, 1080))
//or MAX_QUALITY 速さ優先かクオリティ優先か
setCaptureMode(CaptureMode.MIN_LATENCY)
....
}.build()
val imageCapture = ImageCaputure(imageCaptureConfig)
//ライフサイクルにbind
CameraX.bindToLifecycle(this, imageCapture)
....
//撮影ボタンが押された時
captureBtn.setOnClickListener {
val fileName = System.currentTimeMillis().toString()
val fileFormat = ".jpg"
val imageFile = createTempFile(fileName, fileFormat)
// 撮影画像の保存
imageCapture.takePicture(imageFile, object : ImageCapture.OnImageSavedListener {
override fun onImageSaved(file: File) {
// handle success
}
override fun onError(useCaseError: ImageCapture.UseCaseError, message: String, cause: Throwable?) {
// handle error
}
})
}
撮影する画像の設定を実装したImageCaptureConfigに基づいてImageCaptureクラスを作成し、
ImageCapture内のtakeCapture関数を呼んで撮影する。
#まとめ
プレビュー、キャプチャ、解析の3つのユースケースをライブサイクルにbindすることで、
指定したライフサイクルに沿ってカメラを有効にするタイミング、データの生成、破棄を行うことができる。
また、デバイス間の違いを吸収し、同様の機能を備えたカメラアプリを簡潔に実装することができる。