【今更だけどandroid.hardware.Cameraを使う】端末にあるカメラを探す

このエントリーを Google ブックマーク に追加
Pocket
[`yahoo` not found]

android.hardware.Cameraを使うことで、Android端末にあるカメラデバイスにアクセスして使うことができます。
android.hardware.Cameraは、現在では非推奨となっていますがOpenCV等ではまだまだ使われています。

今回は、Android端末に設置されているカメラを探します。

マニフェストの設定

android.hardware.Cameraを使いカメラデバイスにアクセスする際にはパーミッションが必要になります。
また、ファイルの保存やビデオの音声を保存するために各種パーミッションをマニフェストに追加します。
    <uses-feature android:name="android.hardware.camera" />
    <uses-permission android:name="android.permission.CAMERA" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.RECORD_AUDIO" />

カメラの一覧を作成する

Android端末に存在するカメラの個数はstatic int getNumberOfCameras()で取得することがでます。
Camera.getNumberOfCamerasで得られた数値以下の値はカメラIDとして扱うことができます。
static void getCameraInfo(int cameraId, Camera.CameraInfo cameraInfo)を使うことでカメラ情報を取得することができます。
Camera.getCameraInfoの第一引数はカメラIDを渡します。第二引数はカメラ情報を詰めてもらうためにCamera.CameraInfoインスタンスを渡します。

Camera.CameraInfoとは

Camera.CameraInfoはAndroid端末に設置されているカメラ情報を表すクラスです。
public boolean canDisableShutterSoundカメラのシャッター音を無効化できるかどうかが格納されます。trueの場合は無効化できます。falseの場合は無効化できません。
public int facingカメラの設置箇所が格納されます。Camera.CameraInfo.CAMERA_FACING_BACKの場合は背面のカメラを表し、Camera.CameraInfo.CAMERA_FACING_FRONTの場合はスクリーン側のカメラを表します。
public int orientation撮影されるカメラ画像の向きが格納されます。カメラ画像を時計回りに回転させる必要がある角度で、自然な向きでディスプレイに正しく表示されます。0、90、180、または270にする必要があります。

Camera.CameraInfoのリスト


    private List<Camera.CameraInfo> mCameraList;

    /**
     * カメラ一覧を作る
     */
    private void createCameraList() {
        mCameraList = new ArrayList<>();
        // カメラの個数を取得する。
        int numberOfCameras = Camera.getNumberOfCameras();
        for (int i = 0; i < numberOfCameras; i++) {
            Camera.CameraInfo cameraInfo = new Camera.CameraInfo();
            Camera.getCameraInfo(i , cameraInfo);
            mCameraList.add(cameraInfo);
        }
    }

レイアウトファイルの作成

レイアウトファイルにLinearLayoutを配置し、このLinearLayoutにカメラ情報を表示したButtonを設置していきます。
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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"
    android:orientation="vertical"
    tools:context="yona.mycamera.MainActivity">

    <HorizontalScrollView
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <LinearLayout
            android:id="@+id/linear_layout_camera_select"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="horizontal"/>

    </HorizontalScrollView>
</LinearLayout>

Camera.CameraInfoリストを元にViewを追加する

取得したCamera.CameraInfoリストを元に各情報をButtonのテキストとして表示します。

    /**
     * カメラ選択ボタンを作る
     */
    private void addSelectCameraButton() {
        LinearLayout linearLayout = (LinearLayout)findViewById(R.id.linear_layout_camera_select);
        for (Camera.CameraInfo cameraInfo : mCameraList) {
            Button button = new Button(this);
            button.setGravity(Gravity.LEFT);
            StringBuilder buttonText = new StringBuilder();
            // カメラの設置箇所を判断する
            buttonText.append("カメラの設置箇所 : ");
            if(Camera.CameraInfo.CAMERA_FACING_FRONT == cameraInfo.facing) {
                buttonText.append("フロントカメラ");
            } else {
                buttonText.append("バックカメラ");
            }

            buttonText.append("\n");
            buttonText.append("カメラの向き : ");
            buttonText.append(cameraInfo.orientation);
            buttonText.append("\n");
            buttonText.append("シャッター音 : ");
            if (cameraInfo.canDisableShutterSound) {
                buttonText.append("無効化できます。");
            } else {
                buttonText.append("無効化できません。");
            }
            button.setText(buttonText.toString());
            linearLayout.addView(button);
        }
    }

まとめ

今回は端末に存在するカメラの一覧を取得しました。
public class MainActivity extends Activity {

    private List<Camera.CameraInfo> mCameraList;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        createCameraList();
        addSelectCameraButton();
    }

    /**
     * カメラ一覧を作る
     */
    private void createCameraList() {
        mCameraList = new ArrayList<>();
        // カメラの個数を取得する。
        int numberOfCameras = Camera.getNumberOfCameras();
        for (int i = 0; i < numberOfCameras; i++) {
            Camera.CameraInfo cameraInfo = new Camera.CameraInfo();
            Camera.getCameraInfo(i , cameraInfo);
            mCameraList.add(cameraInfo);
        }
    }

    /**
     * カメラ選択ボタンを作る
     */
    private void addSelectCameraButton() {
        LinearLayout linearLayout = (LinearLayout)findViewById(R.id.linear_layout_camera_select);
        for (Camera.CameraInfo cameraInfo : mCameraList) {
            Button button = new Button(this);
            button.setGravity(Gravity.LEFT);
            StringBuilder buttonText = new StringBuilder();
            // カメラの設置箇所を判断する
            buttonText.append("カメラの設置箇所 : ");
            if(Camera.CameraInfo.CAMERA_FACING_FRONT == cameraInfo.facing) {
                buttonText.append("フロントカメラ");
            } else {
                buttonText.append("バックカメラ");
            }

            buttonText.append("\n");
            buttonText.append("カメラの向き : ");
            buttonText.append(cameraInfo.orientation);
            buttonText.append("\n");
            buttonText.append("シャッター音 : ");
            if (cameraInfo.canDisableShutterSound) {
                buttonText.append("無効化できます。");
            } else {
                buttonText.append("無効化できません。");
            }
            button.setText(buttonText.toString());
            linearLayout.addView(button);
        }
    }
}