我试图在设备旋转时旋转相机,iv尝试了几种方法,但它们似乎都不适用于所有设备。
//这适用于我的nexus 5,但不适用于我的三星Galaxy标签
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height)
{
if (mHolder.getSurface() == null)
{
return;
}
try
{
mCamera.stopPreview();
Camera.Parameters parameters = mCamera.getParameters();
parameters.set("orientation", "landscape");
int rotation = ((WindowManager) getContext().getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay().getRotation();
int orientation = getContext().getResources().getConfiguration().orientation;
if (rotation == Surface.ROTATION_0) {
if (orientation == Configuration.ORIENTATION_LANDSCAPE) {
mCamera.setDisplayOrientation(0);
} else {
mCamera.setDisplayOrientation(90);
}
}
else if (rotation == Surface.ROTATION_90) {
if (orientation == Configuration.ORIENTATION_PORTRAIT) {
mCamera.setDisplayOrientation(270);
}
}
else if (rotation == Surface.ROTATION_180) {
if (orientation == Configuration.ORIENTATION_LANDSCAPE) {
mCamera.setDisplayOrientation(180);
}
}
else if (rotation == Surface.ROTATION_270) {
if (orientation == Configuration.ORIENTATION_PORTRAIT) {
mCamera.setDisplayOrientation(90);
}
}
mCamera.setPreviewDisplay(holder);
mCamera.startPreview();
}
catch (Exception e) {
}
}
//我试过这个,这是文档的一部分,它在我的nexus 5上不起作用:
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);
}
是否有人为所有设备提供了有效的解决方案?
答案 0 :(得分:2)
虽然我不完全确定您提供的代码中的问题是什么,但在Android上使用Camera API和图像轮换时,必须要做的事情很少(旧的 - 在API上) < 21)
<强> 1。您必须考虑图像传感器的orientation。
传感器的方向意味着它与设备本机使用模式的角度。 (这就是你正在使用的谷歌片段实际上是什么)对于手机,这通常被设置为肖像,平板电脑到横向。 以下是文档的摘录,它可以让人头疼一段时间,但事情就是如此。
例如,假设设备具有自然高的屏幕。后置摄像头传感器安装在横向上。你在看屏幕。如果相机传感器的顶部与自然方向的屏幕右边缘对齐,则值应为90.如果前置摄像头传感器的顶部与屏幕右侧对齐,则值应为是270。
<强> 2。正面镜像正面镜头预览
如果使用前置摄像头,则必须考虑隐式镜像。
第3。这些规则仅用于旋转相机预览
这很重要。所有这些只是为了让您在设备屏幕上显示正确旋转的预览帧。拍摄实际照片后,您必须再次旋转它以满足您的需要。对于前置图像,这可能意味着自己镜像,......你可以看到这个&#34;怪异的结果&#34;在Android上的所有应用中。只需在环聊中拍照并立即分享即可。在各种手机上你得到一些奇怪的旋转图像作为结果。
<强> 4。 OEM始终不遵守规范
我只能说,可能没有任何解决方案是无忧无虑的,我们在某些特定设备上遇到了一些问题。 (像往常一样在Android上:)
<强> 5。使用CWAC相机库
我们发现this library是官方Camera API的优秀包装器。几乎解决了我提到的所有问题。