Camera機能の使用方法|Android開発

      2018/05/24

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

 - Android