问题 Nexus 5x反向横向传感器修复在Android相机预览应用程序中


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

问题是我没有看到某些事情发生了变化。

有什么想法吗?


11165
2018-02-15 16:18


起源



答案:


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


9
2018-02-16 11:23



这对于预览是正确的,但是当您想要处理拍摄的图像时,您仍然需要考虑相机旋转270,而大多数设备上的旋转为90(意味着图像是颠倒的)。 - Emanuel Moecklin
@EmanuelMoecklin是的以上代码修复了相机显示,但显示的图像仍然是颠倒的,我该如何解决这个问题? - user2056563
我使用OpenCV4Android旋转图像 - Heribert
@Robert Williams,在这种情况下CameraId是什么? - Euridice01
我正在使用该代码,但它没有任何效果。 :-( - nasch


答案:


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


9
2018-02-16 11:23



这对于预览是正确的,但是当您想要处理拍摄的图像时,您仍然需要考虑相机旋转270,而大多数设备上的旋转为90(意味着图像是颠倒的)。 - Emanuel Moecklin
@EmanuelMoecklin是的以上代码修复了相机显示,但显示的图像仍然是颠倒的,我该如何解决这个问题? - user2056563
我使用OpenCV4Android旋转图像 - Heribert
@Robert Williams,在这种情况下CameraId是什么? - Euridice01
我正在使用该代码,但它没有任何效果。 :-( - nasch


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

将5x更改为5X即可。


4
2017-09-05 02:16





同样在这里。 由于camera2不支持<API 21设备,并且不想实现这两个API,因此最好快速修复。

我正在尝试像:

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

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

使用2 apis是一件坏事吗? 如本主题所述,不建议: 如何使用Android的相机或camera2 API来支持旧版和新版API,而无需弃用备注?


0
2018-02-16 10:44



Nexus 6P怎么样? - innich