Camera2 APIを使ったカメラ機能の実装|Android開発

      2017/04/04

Androidの新しいカメラモジュール、Camera2 API(android.hardware.camera2)
を使ったカメラ機能の実装方法です。

permissionの追加

カメラを使用するためにはAndroidManifest.xmlで

を指定しておく必要があります。

layout

プレビュー表示を行うためのTextureViewを用意します。

カメラの利用手順

準備

  • TextureViewがavailableかどうかをチェックします。

    • available(true)ならオープン処理を行います。
    • 非available(false)ならTextureView.SurfaceTextureListenerを設定して、availableになるのを待ちます。
  • TextureView.SurfaceTextureListener.onSurfaceTextureAvailable()
    TextureViewがavailableになったらカメラのオープン処理を行います。

カメラのオープン

  • CameraManagerのインスタンスを取得します。
  • オープンするカメラのIDを決めます。
  • ImageReaderを生成します。ImageReaderは主に撮影時に使用します。

    mTakePictureAvailableListenerについては後述。

  • CameraManagerにオープン要求を出します。
  • CameraDevice.StateCallback.onOpened()
    • SurfaceTextureにプレビューサイズを設定し、プレビュー用のSurfaceを生成します。
    • CaptureSessionを生成します。(cameraはonOpened()のパラメータ・CameraDevice)
    • パラメータのCameraDeviceを保持しておきます。
  • CameraCaptureSession.StateCallback.onConfigured()
    • パラメータのCameraCaptureSessionを保持しておきます。

プレビューの開始

  • プレビュー用のCaptureRequest.Builderを生成します。
  • CaptureRequest.Builderにプレビュー用のSurfaceを設定します。
  • 必要なパラメータを設定します。(下記はサンプル)
  • プレビューを開始します。

撮影

  • 撮影用のCaptureRequest.Builderを生成します。
  • CaptureRequest.Builderに撮影用のSurfaceを設定します。
  • 必要なパラメータを設定します。(下記はサンプル)
  • 現在のプレビューを停止します。
  • 撮影を開始します。
  • CameraCaptureSession.CaptureCallback.onCaptureCompleted()
    撮影完了のタイミングで通知されます。

撮影画像の通知

カメラオープン時に指定したmTakePictureAvailableListenerが撮影画像を受信します。

  • 撮影画像はImageReader.OnImageAvailableListener.onImageAvailable()で通知されます。
  • Image(android.media.Image)を取得します。

    または

  • 取得したImageを処理します。(保存など)
  • Imageを解放します。これを忘れるとバースト撮影などで失敗します。

カメラのクローズ

  • CameraCaptureSessionをクローズします。
  • CameraDeviceをクローズします。
  • ImageReaderをクローズします。

 - Android