【今更だけど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);
}
}
}