【问题标题】:Nexus 5x reverse landscape sensor fix in a android camera preview appAndroid 相机预览应用中的 Nexus 5x 反向横向传感器修复
【发布时间】: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();

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

有什么想法吗?

【问题讨论】:

    标签: android android-camera android-view android-camera2


    【解决方案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 怎么样?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-04-19
      • 2010-10-06
      • 2018-06-17
      • 2014-07-14
      • 2021-04-17
      • 1970-01-01
      相关资源
      最近更新 更多