【今更だけどandroid.hardware.Cameraを使う】端末にあるカメラを探す
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); } } }