关于SnapdragonCamera中Camera2前置摄像头横屏预览倒置问题的求助
我在调试SnapdragonCamera时遇到一个问题:使用前置摄像头时,竖屏模式下预览显示正常,但切换到横屏模式后,预览画面是倒置的。请问该如何修复?
(示意图说明:竖屏前置预览画面显示正常;横屏前置预览画面上下倒置)
作为经常折腾Camera2相机应用的开发者,我之前也碰到过类似的方向适配坑,针对SnapdragonCamera这个场景,你可以试试下面这几个排查和修复方向:
核对传感器方向与屏幕旋转的映射关系
前置摄像头的物理传感器方向一般和后置不同,你可以先通过CameraCharacteristics.SENSOR_ORIENTATION获取该前置摄像头的固定传感器方向(通常是270°或180°),再结合当前屏幕的旋转角度(通过Display.getRotation()获取,对应Surface.ROTATION_0/ROTATION_90等状态),计算出预览画面需要的正确旋转角度。比如如果传感器方向是270°,当屏幕横屏(ROTATION_90)时,可能需要给预览设置180°的旋转来修正。调整CaptureRequest的旋转参数
在创建预览用的CaptureRequest时,别漏了方向参数的设置。你可以在构建CaptureRequest时,调用request.set(CaptureRequest.JPEG_ORIENTATION, calculatedRotation),这里的calculatedRotation就是你刚才算出的正确旋转角度。另外,有些场景下可能需要配合CaptureRequest.CONTROL_MODE来确保旋转参数生效。修正预览载体的显示变换
如果你的预览是用TextureView承载的,横屏时可以直接给TextureView设置变换矩阵来修正画面。比如:
int rotation = calculateCorrectRotation(); Matrix matrix = new Matrix(); matrix.postRotate(rotation, textureView.getWidth() / 2f, textureView.getHeight() / 2f); textureView.setTransform(matrix);
要是用的是SurfaceView,可以通过调整Surface的缓冲区方向或者给父布局设置旋转来处理。
- 检查SnapdragonCamera的厂商适配逻辑
因为是高通定制的SnapdragonCamera,可能源码里有针对不同机型的硬编码适配逻辑。你可以去查看PreviewSession或者CameraDeviceConfig这类和预览配置相关的类,看看是不是横屏场景下,前置摄像头的方向翻转逻辑被遗漏了——比如有些厂商会针对特定传感器型号做方向补偿,横屏时没把前置的情况考虑进去。
备注:内容来源于stack exchange,提问作者Huajie Xu

