Camera2 APIを使ったカメラ機能の実装|Android開発
Androidの新しいカメラモジュール、Camera2 API(android.hardware.camera2)
を使ったプレビューと撮影の実装方法です。
本記事を見ながら30分程度で撮影まで行えるよう、細かな調整は省略しています。
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
を保持しておきます
準備からオープン完了までの処理フロー
水色背景は必要に応じて設定する箇所になります。

- 撮影サイズと端末の向きからプレビューサイズを決定する方法
Camera2 撮影サイズから最適なプレビューサイズを決定する|Android開発 - プレビューサイズから
TextureView
のサイズを調整する方法
Camera2 TextureViewの回転(プレビューアスペクト比キープ)|Android開発


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

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

撮影画像の通知
カメラオープン時に指定したmTakePictureAvailableListener
が撮影画像を受信します
- 撮影画像は
ImageReader.OnImageAvailableListener.onImageAvailable()
で通知されます android.media.Image
を取得します
または
- 取得した
android.media.Image
を処理します(保存など) android.media.Image
を解放します。これを忘れるとバースト撮影などで失敗します
撮影画像通知のフロー

撮影完了通知のフロー

カメラのクローズ
CameraCaptureSession
をクローズします
CameraDevice
をクローズします
ImageReader
をクローズします
クローズのフロー
