Camera実装時によく使う処理のサンプル|Android開発
カメラ(android.hardware.Camera)実装時によく使う処理をまとめてみました。
カメラがサポートするプレビューサイズの取得
import android.util.Size;
public static List<Size> getSupportedPreviewSizes(int cameraId) {
Camera camera;
ArrayList<Size> resultSizes = new ArrayList<>();
camera = Camera.open(cameraId);
if (camera == null) {
return resultSizes;
}
try {
Camera.Parameters parameters = camera.getParameters();
List<Camera.Size> previewSizes = parameters.getSupportedPreviewSizes();
Collections.sort(previewSizes, CameraSizeComparator);
/* プレビューサイズ. */
for (Camera.Size sz : previewSizes) {
resultSizes.add(new Size(sz.width, sz.height));
}
return resultSizes;
} finally {
camera.release();
}
}
カメラがサポートする撮影サイズの取得
import android.util.Size;
public static List<Size> getSupportedPictureSizes(int cameraId) {
Camera camera;
ArrayList<Size> resultSizes = new ArrayList<>();
camera = Camera.open(cameraId);
if (camera == null) {
return resultSizes;
}
try {
Camera.Parameters parameters = camera.getParameters();
List<Camera.Size> pictureSizes = parameters.getSupportedPictureSizes();
Collections.sort(pictureSizes, CameraSizeComparator);
/* 撮影サイズ. */
for (Camera.Size sz : pictureSizes) {
resultSizes.add(new Size(sz.width, sz.height));
}
return resultSizes;
} finally {
camera.release();
}
}
ソート処理
上記で使用したサイズ比較オブジェクトです。下記はサイズを降順に並べ替えます。
protected static final java.util.Comparator<Camera.Size> CameraSizeComparator =
new java.util.Comparator<Camera.Size>() {
@Override
public int compare(Camera.Size lhs, Camera.Size rhs) {
int result = rhs.width - lhs.width;
if (result == 0) {
result = rhs.height - lhs.height;
}
return result;
}
};
ディスプレイ回転度の計算
Camera.setDisplayOrientation()
Camera.Parameters.setRotation()
に渡す値の計算方法。
下記でdegrees
がパラメータの値となります。
private static final SparseIntArray ORIENTATIONS = new SparseIntArray();
static {
ORIENTATIONS.append(Surface.ROTATION_0, 0);
ORIENTATIONS.append(Surface.ROTATION_90, 90);
ORIENTATIONS.append(Surface.ROTATION_180, 180);
ORIENTATIONS.append(Surface.ROTATION_270, 270);
}
protected int calculateDegrees() {
// Fragmentクラスの場合.
int rotation = getActivity().getWindowManager().getDefaultDisplay().getRotation();
int displayOrientation = ORIENTATIONS.get(rotation);
Camera.CameraInfo cameraInfo = new Camera.CameraInfo();
Camera.getCameraInfo(cameraId, cameraInfo);
int degrees = 0;
if (cameraInfo.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) {
degrees = (cameraInfo.orientation + displayOrientation) % 360;
degrees = (360 - degrees) % 360;
}
return (cameraInfo.orientation - displayOrientation + 360) % 360;
}