我正在使用此代码:
在Manifest
中,Activity Orientation
设置为横向。
因此,它允许用户仅在横向模式下拍摄照片,如果通过将设备保持在纵向模式拍照,则保存的图像如下:
90度旋转图像。
在寻找解决方案后,我发现了这个:
Android - Camera preview is sideways
解决方案是:
在surfaceChanged()
中检查
Display display = ((WindowManager)getSystemService(WINDOW_SERVICE)).getDefaultDisplay();
display.getRotation();
并相应地更改相机的displayOrientation 。
camera.setDisplayOrientation(90);
但无论我旋转设备多少次,surfaceChanged()
都不会被调用。
我甚至尝试删除 Manifest.xml 中的orientation="Landscape"
,但是预览本身会侧向显示(可能是因为默认android.view.SurfaceView
应该在横向模式?)。
答案 0 :(得分:4)
试试这个。
public void surfaceCreated(SurfaceHolder holder) {
try {
camera = Camera.open();
camParam = camera.getParameters();
Camera.Parameters params = camera.getParameters();
String currentversion = android.os.Build.VERSION.SDK;
Log.d("System out", "currentVersion " + currentversion);
int currentInt = android.os.Build.VERSION.SDK_INT;
Log.d("System out", "currentVersion " + currentInt);
if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) {
if (currentInt != 7) {
camera.setDisplayOrientation(90);
} else {
Log.d("System out", "Portrait " + currentInt);
params.setRotation(90);
/*
* params.set("orientation", "portrait");
* params.set("rotation",90);
*/
camera.setParameters(params);
}
}
if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) {
// camera.setDisplayOrientation(0);
if (currentInt != 7) {
camera.setDisplayOrientation(0);
} else {
Log.d("System out", "Landscape " + currentInt);
params.set("orientation", "landscape");
params.set("rotation", 90);
camera.setParameters(params);
}
}
camera.setPreviewDisplay(holder);
camera.startPreview();
} catch (IOException e) {
Log.d("CAMERA", e.getMessage());
}
}
答案 1 :(得分:0)
由于您已迫使应用程序成为横向应用程序,因此在旋转设备时,应用程序的配置不会更改,因此您的UI不会重新绘制。因此,你永远不会看到surfaceCreated / Changed回调。
在任何情况下,您的问题都不是预览,而是拍摄的照片。
相机API不会自动知道哪个方向已关闭;它需要您使用Camera.Parameters setRotation方法告诉它您希望如何旋转图像。这里有几个坐标系统(相机传感器相对于您的设备的方向; UI相对于设备的方向;以及设备相对于世界的方向)必须正确完成。
所以我强烈建议您使用setRotation文档中提供的代码,并继承自OrientationEventListener,按如下方式实现监听器:
public void onOrientationChanged(int orientation) {
if (orientation == ORIENTATION_UNKNOWN) 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);
}
这将正确更新相机的静态图片方向,以便“向上”始终处于启动状态,无论您的应用是横向还是纵向,或者您的设备是平板电脑还是手机。