Camera機能の使用方法|Android開発
AndroidでCamera(android.hardware.Camera)機能の使用方法です。
なお、android.hardware.CameraはAPI level 21.からdeprecatedです。
permissionの追加
カメラを使用するためにはAndroidManifest.xml
で
<uses-permission android:name="android.permission.CAMERA"></uses-permission>
を指定しておく必要があります。
layout
プレビュー表示を行うためのSurfaceViewを用意します。
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent">
<SurfaceView
android:id="@+id/camera_v1_surface"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:visibility="visible"/>
</FrameLayout>
カメラの利用手順
準備
- 生成したSurfaceViewインスタンスから
SurfaceHolder
を取得、保持します。
SurfaceHolder mHolder = {SurfaceViewインスタンス}.getHolder();
SurfaceHolder
にSurfaceHolder.Callback
を設定します。
mHolder.addCallback(mSurfaceHolderCallback);
SurfaceHolder.Callback mSurfaceHolderCallback = new SurfaceHolder.Callback() {...};
SurfaceHolder.Callback.surfaceChanged()
本メソッド受信以降でカメラのオープン処理を行います。
カメラのオープン
カメラのオープンを行います。オープンするカメラのIDを指定します。
Camera mCamera = Camera.open(Camera.CameraInfo.CAMERA_FACING_BACK);
プレビューの開始
- プレビュー領域を指定します。指定するのは先程取得した
SurfaceHolder
です。
mCamera.setPreviewDisplay(mHolder);
- 必要なパラメータを設定します。(下記はサンプル)
Camera.Parameters parameters = mCamera.getParameters();
// プレビューサイズ.
parameters.setPreviewSize(1280, 720);
// 撮影サイズ.
parameters.setPictureSize(1920, 1080);
mCamera.setParameters(parameters);
- ディスプレイの角度を指定することで、プレビューの向きを調整します。
mCamera.setDisplayOrientation(degrees);
setPreviewCallback()
でプレビュー中の画像データを受信できます。(必要な場合のみ)
mCamera.setPreviewCallback(mPreviewCallback);
Camera.PreviewCallback mPreviewCallback = new Camera.PreviewCallback() {...};
- プレビューを開始します。
mCamera.startPreview();
[2017.04.21追記]別のプレビュー画像取得方法Cameraプレビュー画像を取得する|Android開発
撮影
- 必要なパラメータを設定します。(下記はサンプル)
Camera.Parameters parameters = mCamera.getParameters();
// 撮影画像の角度.
parameters.setRotation(rotation);
mCamera.setParameters(parameters);
- 撮影を開始します。撮影後のデータ形式毎にコールバックが指定できます。(下記はJpegを指定)
mCamera.takePicture(null, null, mTakePictureJpeg);
Camera.PictureCallback mTakePictureJpeg = new Camera.PictureCallback() {...};
- コールバックに通知された撮影画像を処理します。(保存など)
上記の場合、Camera.PictureCallback.onPictureTaken(byte[] data, Camera camera)
で受信します。
カメラのクローズ
setPreviewCallback()
でプレビュー中の画像データを受信していた場合は通知を解除します。
mCamera.setPreviewCallback(null);
- プレビューの停止(必須ではないようです)
mCamera.stopPreview();
- カメラの解放を行います。
mCamera.release();