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();
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();