概要
CameraX でカメラを一時停止する方法の続きとなります。
前回の課題
androidx.camera:camera-core:1.0.0-alpha05 までは onPreviewOutputUpdateListener を使ってカメラの映像を一時停止・再開することができた。
以降のバージョンでは、onPreviewOutputUpdateListener が廃止され、一時停止・再開させる方法を検討した結果、暗転せずに一時停止から再開する方法が見つからず困っていた。
検証環境
camerax-core:1.1.0-rc01
今回試したもの
CameraX は下記のコードでライフサイクルに合わせた処理を自動でやってくれるようになっています
cameraProvider.bindToLifecycle(this as LifecycleOwner, cameraSelector, preview)
preview を unbind / bind したり、 Preview.setSurfaceProvider() で一時停止・再開を試みましたが、再開時に画面が暗転してしまっていましたが、今回は lifecycle を利用することで実現することができました。
カスタム LifecycleOwner の実装
まず LifecycleOwner を独自で定義します。
class CustomLifecycle : LifecycleOwner {
private val lifecycleRegistry: LifecycleRegistry
init {
lifecycleRegistry = LifecycleRegistry(this)
lifecycleRegistry.markState(Lifecycle.State.CREATED)
}
fun doOnResume() {
lifecycleRegistry.markState(Lifecycle.State.RESUMED)
}
fun doStart() {
lifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_START)
}
fun doPause() {
lifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_STOP)
}
override fun getLifecycle(): Lifecycle {
return lifecycleRegistry
}
}
続いて、cameraProvider に渡します
val customLifecycle = CustomLifecycle()
var camera = cameraProvider.bindToLifecycle(customLifecycle, cameraSelector, preview)
ここまでで、CameraX に独自のライフサイクルを伝えられるようにします。
一時停止させる場合
一時停止させたいタイミングで CustomLifecycle#doStop() を呼びます
customLifecycle.doStop()
LifecycleRegistory#handleLifecycleEvent() に対して、Lifecycle.Event.ON_STOP を指定することで ON_STOP 状態を通知することができます。
※ ON_PAUSE では CameraX は停止しませんでした。
再開させる場合
同じように再開させたいタイミングで CustomLifecycle#doStart() を呼びます
customLifecycle.doStart()
LifecycleRegistory#handleLifecycleEvent() に対して、Lifecycle.Event.ON_START を指定することで ON_START 状態を通知することができます。
※ ON_RESUME でも再開しました
注意点
CustomLifecycle の onResume, onPause などを Fragment もしくは Activity と同期する必要があるため、Fragment や Activity から doOnResume() などの呼び出しが必要となります。
※ これを忘れると CameraX 自体が起動しません
結果
前回のエントリでは完全に暗転した状態からカメラのプレビューが再開されていましたが、今回の方法では(一瞬、暗くはなるものの)自然な流れで再開することができました。