概要
I/Oで発表があったCameraX。Codelabsで公開されていたものを試してみました。ちょっとハマったとこがあったので、メモがてら書いておきます。
Getting Started with CameraX
というのも、I/O Extended 2019 Tokyo@GDG にてCodelabsの課題が上がっていたからです笑
当日はセッションに興味がありCodelabsには参加しませんでしたが、また機会があれば参加してみたい。
実装の流れ
実際のCodelabsをみてもらえたらいいと思うんですが、簡単に流れを書いておきます。Codelabsのセクションとはちょっと変えてます。
- CameraXをgradleに追加
- view finder layoutを準備
- Cameraのパーミッションを付与
- Permission許可&チェックのコードを記述
- view finder(use case)を実装
- image capture(use case)を実装
- image analysis(use case)を実装
ポイント
-
use caseを作る。
- Preview(view finder): プレビュー
- ImageCaputure: 画像保存
- ImageAnalysis: 画像解析
-
作ったuse caseを、
CameraX.bindToLifecycle(this, preview, imageCapture, analyzerUseCase)
でlifecycleOwner(Activity)にbindする
ハマったところ
プレビューが縦に潰れる。。
val previewConfig = PreviewConfig.Builder().apply {
setTargetAspectRatio(Rational(1, 1))
setCaptureMode(ImageCapture.CaptureMode.MIN_LATENCY)
}.build()
アスペクトをが1:1で設定しているのに、プレビューが縦に崩れる。。。
結局崩れるのはなぜかわからなかったんですが、公式のサンプル
の通りに実際のViewのディスプレイサイズを取得し設定したら治った。
val metrics = DisplayMetrics().also { viewFinder.display.getRealMetrics(it) }
val screenAspectRatio = Rational(metrics.widthPixels, metrics.heightPixels)
val screenSize = Size(metrics.widthPixels, metrics.heightPixels)
val previewConfig = PreviewConfig.Builder().apply {
setTargetAspectRatio(screenAspectRatio)
setTargetResolution(screenSize)
}.build()
Capture時に保存された画像は正常だったところを見ると、Viewに反映される際になにか問題があるのかも。時間が許せばもっと探ってみようかな。。
所感
lifecycleにbindでき、自分で面倒を見ないでいいのがすごく楽だと感じました。
もうすこしドキュメント見て、触ってみようと思えました。