7
2

More than 3 years have passed since last update.

続・CameraX でカメラを一時停止する方法

Posted at

概要

CameraX でカメラを一時停止する方法の続きとなります。

前回の課題

androidx.camera:camera-core:1.0.0-alpha05 までは onPreviewOutputUpdateListener を使ってカメラの映像を一時停止・再開することができた。
以降のバージョンでは、onPreviewOutputUpdateListener が廃止され、一時停止・再開させる方法を検討した結果、暗転せずに一時停止から再開する方法が見つからず困っていた。

検証環境

camerax-core:1.1.0-rc01

今回試したもの

カスタムの LifecycleOwner の実装

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 自体が起動しません

結果

前回のエントリでは完全に暗転した状態からカメラのプレビューが再開されていましたが、今回の方法では(一瞬、暗くはなるものの)自然な流れで再開することができました。

7
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
2