Nexus 5x 反向横屏传感器修复在 Android 相机预览应用中。

12

我在Android开发方面有些新手,如果我的问题很基础,请提前谅解。我的应用程序的一部分需要实时预览后置摄像头,所以我创建了一个自定义类,它继承SurfaceView并实现SurfaceHolder.Callback(我基本上按照Android文档中的说明操作)。

不幸的是,我在Nexus 5x上测试我的应用程序时,我才意识到它的相机传感器安装反了。因此,当我在Nexus 5x上运行我的应用程序时,相机预览显示是颠倒的,这不是我想要的。

似乎新的android.hardware.camera2 API能够自动处理这个问题。最终,我将需要使用这个新API更新所有代码,但现在我需要一个快速修复,同时使用旧的相机API。

因此,我在外面阅读资料,并找到了一段代码,我需要在SurfaceChanged方法中引入它来解决这个问题。下面是代码:

Display display = ((WindowManager)getContext().getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay();

        if(display.getRotation() == Surface.ROTATION_0)
        {
            parameters.setPreviewSize(capHeight, capWidth);                           
            camera.setDisplayOrientation(90);
        }

        if(display.getRotation() == Surface.ROTATION_90)
        {
            parameters.setPreviewSize(capWidth, capHeight);                           
        }

        if(display.getRotation() == Surface.ROTATION_180)
        {
            parameters.setPreviewSize(capHeight, capWidth);               
        }

        if(display.getRotation() == Surface.ROTATION_270)
        {
            parameters.setPreviewSize(capWidth, capHeight);
            camera.setDisplayOrientation(180);
        }

        camera.setParameters(parameters);*/

        camera.startPreview();

问题是我没有看到有什么改变。

有什么想法吗?

3个回答

9
5X相机并非“反向”,它在其参数中报告了正确的摄像头方向,因此不需要特殊的解决方法,只需确保正确设置显示方向即可:
 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);
}

来自http://developer.android.com/reference/android/hardware/Camera.html#setDisplayOrientation%28int%29

(注意:此处是原文,未进行翻译)

5
预览时是正确的,但当您要处理拍摄的图像时,仍需要考虑相机旋转,对比大多数设备上的90度,它是270度(意味着图像是倒置的)。 - Emanuel Moecklin
6
是的,上面的代码修复了相机显示问题,但是显示的图像仍然是倒置的,我该如何解决这个问题? - user2056563
@Robert Williams,在这种情况下,CameraId是什么? - Euridice01
@Euridice01 你传递给 open(int) 的相机ID通常是通过迭代摄像头数量并通过CameraInfo(面向方向等)选择最合适的来选择的。 - Robert Williams
1
它可以纠正预览,但字节帧仍然颠倒。 - user924
显示剩余3条评论

6
if (Build.MODEL.equals("Nexus 5X")){
     // rotate camera 180°
     mCamera.setDisplayOrientation(180);
}

将5x更改为5X即可。


0

我也是这样的情况。由于camera2不支持API 21以下的设备,并且不想实现两个API,因此最好能够快速解决。

我正在尝试类似于:

if (Build.MODEL.equals("Nexus 5x")){
     // rotate camera 180°
     mCamera.setDisplayOrientation(180);
}

但是无法旋转相机的显示。我要检查一下PreviewCallback是否有什么问题。

使用这两个API是否不好? 就像在这个话题中,不建议使用: 如何使用Android的camera或camera2 API支持旧版和新版API版本而不会出现弃用说明?


1
那Nexus 6P怎么样? - innich

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接