takePictureの呼び出しから受け取ったJPEG画像を回転させようとしているだけの場合は、setRotationが適切な方法です。
setRotationに渡す値についての質問はありますか?保存されたJPEG画像で実際の「上」を「上」にしたい場合、setRotateは、世界に対するカメラセンサーの現在の向きに基づいて設定する必要があります。
デバイス全体の世界に対する相対的な向きを確認し、カメラセンサーの向きがデバイスの「自然な」向きを基準にして、2つの回転を組み合わせて最終的な答えを得ることができます。計算は間違えやすいので、setRotationのAPIドキュメントで明示的に説明しています。ここに再現されています。
public void onOrientationChanged(int orientation) {
if (orientation == ORIENTATION_UNKNOWNsetRotation) return;
android.hardware.Camera.CameraInfo info =
new android.hardware.Camera.CameraInfo();
android.hardware.Camera.getCameraInfo(cameraId, info);
orientation = (orientation + 45) / 90 * 90;
int rotation = 0;
if (info.facing == CameraInfo.CAMERA_FACING_FRONT) {
rotation = (info.orientation - orientation + 360) % 360;
} else { // back-facing camera
rotation = (info.orientation + orientation) % 360;
}
mParameters.setRotation(rotation);
}
OrientationEventListenerから継承し、コールバックメソッドに上記を実装する必要があります。もちろん、パラメータを更新する前に、カメラが開いていること、およびmParametersなどが有効であることを確認する必要があります。
これは、カメラから送信されるJPEGのみを回転させることに注意してください。プレビューがUIで正しく方向付けられていないことがわかった場合は、そのためにsetDisplayOrientationを呼び出す必要があります。カメラセンサーは通常、デバイスの横向きに配置されているため、横向きのカメラアプリは、通常とは異なるAndroidデバイスを使用している場合でも、この関数を呼び出さなくても逃げることができます。ただし、縦向きのアプリを作成している場合は、UIに合わせて表示の向きを調整する必要があります。setRotationと同様に、いくつかの要素を考慮する必要があります。計算を正しく行うためのサンプルコードは、ドキュメントに含まれています。