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

Posted

技术标签:

【中文标题】Android 相机预览应用中的 Nexus 5x 反向横向传感器修复【英文标题】:Nexus 5x reverse landscape sensor fix in a android camera preview app 【发布时间】:2016-05-26 15:28:47 【问题描述】:

我是 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();

问题是我看不出有什么变化。

有什么想法吗?

【问题讨论】:

【参考方案1】:

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

【讨论】:

这对于预览来说是正确的,但是当您想要处理拍摄的图像时,您仍然需要考虑相机旋转,它是 270,而在大多数设备上是 90(这意味着图像是上下颠倒的)。跨度> @EmanuelMoecklin 是的,上面的代码修复了相机显示,但显示的图像仍然颠倒,我该如何解决这个问题? 我使用 OpenCV4Android 旋转了图像 @Robert Williams,在这种情况下,CameraId 是什么? 它纠正了预览,但字节帧仍然颠倒了【参考方案2】:
if (Build.MODEL.equals("Nexus 5X"))
     // rotate camera 180°
     mCamera.setDisplayOrientation(180);

将 5x 改为 5X 即可。

【讨论】:

【参考方案3】:

这里也一样。 由于 camera2 不支持

我正在尝试类似的东西:

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

但无法旋转相机的显示。将检查是否与 PreviewCallback 有关

使用 2 个 api 是不是一件坏事? 与本主题一样,不推荐: How to use Android's camera or camera2 API to support old and new API versions without deprecation notes?

【讨论】:

Nexus 6P 怎么样?

以上是关于Android 相机预览应用中的 Nexus 5x 反向横向传感器修复的主要内容,如果未能解决你的问题,请参考以下文章

Android camera2 曝光问题。在使用 YUV ImageReader 的情况下预览过度曝光

三星 Galaxy S3、S4、S5 的 Android 相机/图片方向问题

Nexus 5X 使用Zxing扫描倒立

Nexus 5X 使用Zxing扫描倒立

如何区分 imageReader 相机 API 2 中的 NV21 和 YV12 编码?

Google Nexus 5x Android 7.0 Root