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 相机/图片方向问题