Camera.setDisplayOrientationのドキュメントページには、「カメラ画像をディスプレイと同じ向きで表示する」ことを示す次のコードサンプルが含まれています。
public static void setCameraDisplayOrientation(Activity activity,
int cameraId, android.hardware.Camera camera) {
android.hardware.Camera.CameraInfo info =
new android.hardware.Camera.CameraInfo();
android.hardware.Camera.getCameraInfo(cameraId, info);
int rotation = activity.getWindowManager().getDefaultDisplay()
.getRotation();
int degrees = 0;
switch (rotation) {
case Surface.ROTATION_0: degrees = 0; break;
case Surface.ROTATION_90: degrees = 90; break;
case Surface.ROTATION_180: degrees = 180; break;
case Surface.ROTATION_270: degrees = 270; break;
}
int result;
if (info.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) {
result = (info.orientation + degrees) % 360;
result = (360 - result) % 360; // compensate the mirror
} else { // back-facing
result = (info.orientation - degrees + 360) % 360;
}
camera.setDisplayOrientation(result);
}
しかし、使用に問題があり、画像が上下逆に表示されることがありました。何度か試行錯誤した結果、正しいコードは次のようになることがわかりました(メソッドの最後の8行を置き換えます)。
int result = (360 + info.orientation - degrees) % 360;
camera.setDisplayOrientation(result);
(つまり、背面カメラの計算は前面カメラでも正しいということです。)「ミラーを補正する」というコメントは、回転によってミラーリングを元に戻すことができないため、少し奇妙です。この操作では、90°と270°の回転のみが入れ替わります。私には本当に意味があります。
したがって、問題は、サンプルが実際に間違っているのか、それとも何かが足りないのかということです。 バックカメラとフロントカメラの両方、およびサポートされているすべての向きの複数のデバイスで試してみたので、コードが機能していることがわかりました。言及する価値があるかもしれない1つの小さな詳細:すべての私のデバイスは90°をとして返しましinfo.orientation
た。
編集:これが 私のカメラ関連のコードです。NexusOneとSamsung GalaxySPlusでテストしました。これは私のヘッドトラッキング3Dアプリで使用されており、プレビューは左下隅に表示され、常に正しい向きになっているはずです。
解決策(一種):コードは正しいように見えますが、私のテスト用電話(Samsung Galaxy S Plus)はフロントカメラのCameraInfo.orientationに対して誤った値を返します。このモデルで逆さまに表示されているプレビューについては、多くの関連する議論があります(こことここの例)。修正する方法は、画像を手動で回転させるオプションを含めることです。