Camera実装時によく使う処理のサンプル|Android開発

      2018/05/24

カメラ(android.hardware.Camera)実装時によく使う処理を纏めてみました。

カメラがサポートするプレビューサイズの取得

import android.util.Size;

public 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 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);
}

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;
} else {
    degrees = (cameraInfo.orientation - displayOrientation + 360) % 360;
}

 - Android