如果您只是想旋转通过调用 takePicture 接收到的 JPEG 图像,那么 setRotation 是正确的使用方法。
关于将什么值传递给 setRotation 的问题是什么?假设您希望真实世界的“向上”在保存的 JPEG 图像中“向上”,则需要根据相机传感器相对于世界的当前方向设置 setRotate。
您可以找出整个设备与世界的相对方向是什么,您可以找出相机传感器的方向相对于设备的“自然”方向是什么,并将这两个旋转组合成最终答案。数学很容易出错,这就是为什么我们在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 一样,您需要考虑一些因素,文档中包含用于正确计算数学的示例代码。