Android应用切换竖屏后相机传感器方向适配问题咨询
问题
我开发的一款Android应用原本仅支持横屏模式,相关代码配置如下:
AndroidManifest.xml
<activity android:name=".MainActivity" android:exported="true" android:screenOrientation="landscape" tools:ignore="LockedOrientationActivity">
CameraHelper.java
private void bindCamera(@NonNull ProcessCameraProvider cameraProvider) { Log.d(TAG, "Binding camera"); CameraSelector cameraSelector = new CameraSelector.Builder() .requireLensFacing(CameraSelector.LENS_FACING_BACK) .build(); // Image analysis settings ImageAnalysis.Builder imageAnalysisBuilder = new ImageAnalysis.Builder(); ImageAnalysis imageAnalysis = imageAnalysisBuilder .setImageQueueDepth(1) .setTargetResolution(new Size(1280, 720)) .setBackpressureStrategy(ImageAnalysis.STRATEGY_KEEP_ONLY_LATEST) .build(); imageAnalysis.setAnalyzer(analyzerExecutor, imageAnalyzer); var captureBuilder = new ImageCapture.Builder(); captureBuilder.setTargetRotation(Surface.ROTATION_90). setCaptureMode(ImageCapture.CAPTURE_MODE_MINIMIZE_LATENCY). setTargetResolution(new Size(4032, 3024)). setJpegQuality(Constants.JPEG_QUALITY). setFlashMode(ImageCapture.FLASH_MODE_OFF); var ext = new Camera2Interop.Extender<>(captureBuilder); ext.setCaptureRequestOption(CaptureRequest.CONTROL_CAPTURE_INTENT, CaptureRequest.CONTROL_CAPTURE_INTENT_MOTION_TRACKING); imageCapture = captureBuilder.build(); try { cameraProvider.unbindAll(); if (lifecycleOwner.getLifecycle().getCurrentState() != DESTROYED) { this.camera = cameraProvider.bindToLifecycle(lifecycleOwner, cameraSelector, imageCapture, imageAnalysis); } } catch (Exception e) { Log.e(TAG, "Camera binding failed", e); MainActivity.instance.snackbar.showError("Camera binding failed", e); } }
现在我希望将应用改为仅支持竖屏模式,已执行以下操作:
- 将AndroidManifest中
android:screenOrientation改为portrait,此时相机分辨率变为1920x1920; - 修改ImageAnalysis的
setTargetResolution为Size(720,1280),此时相机分辨率变为1280x720。
我查阅了相关资料,了解到需要旋转相机传感器,恳请指导我修改代码以实现竖屏模式下720x1280的相机分辨率。
解决方案
要实现竖屏模式下720x1280的相机分辨率,需调整相机目标旋转方向,并统一ImageAnalysis和ImageCapture的分辨率配置,具体修改如下:
1. 修正ImageCapture的目标旋转方向
横屏时设置的Surface.ROTATION_90不再适配竖屏,需替换为与竖屏匹配的旋转值,推荐从Activity获取当前实际旋转角度(适配所有竖屏场景):
// 替换原有的setTargetRotation(Surface.ROTATION_90)代码 int rotation = ((Activity) lifecycleOwner).getWindowManager().getDefaultDisplay().getRotation(); captureBuilder.setTargetRotation(rotation);
2. 统一竖屏分辨率配置
- ImageAnalysis:保持
Size(720, 1280)的竖屏宽高设置,确保输出分辨率为720x1280:
ImageAnalysis imageAnalysis = imageAnalysisBuilder .setImageQueueDepth(1) .setTargetResolution(new Size(720, 1280)) // 竖屏宽720,高1280 .setBackpressureStrategy(ImageAnalysis.STRATEGY_KEEP_ONLY_LATEST) .build();
- ImageCapture:将目标分辨率改为竖屏对应的尺寸(原横屏4032x3024对应竖屏3024x4032):
captureBuilder.setTargetRotation(rotation) .setCaptureMode(ImageCapture.CAPTURE_MODE_MINIMIZE_LATENCY) .setTargetResolution(new Size(3024, 4032)) // 竖屏宽3024,高4032 .setJpegQuality(Constants.JPEG_QUALITY) .setFlashMode(ImageCapture.FLASH_MODE_OFF);
3. 确认传感器对齐逻辑
CameraX的bindToLifecycle方法会自动根据生命周期所有者的屏幕方向处理传感器旋转,只需确保:
- Activity的
android:screenOrientation已固定为portrait且未被代码动态修改; - 若仍有异常,可通过Camera2Interop扩展强制设置传感器旋转(一般上述步骤已足够):
// 可选:通过Camera2扩展设置传感器旋转 var cameraExt = new Camera2Interop.Extender<>(cameraSelector); cameraExt.setCaptureRequestOption(CaptureRequest.JPEG_ORIENTATION, rotation);
修改完成后重新绑定相机,即可在竖屏模式下得到720x1280的ImageAnalysis分辨率,同时ImageCapture也会输出正确的竖屏照片尺寸。
内容的提问来源于stack exchange,提问作者Katya Sapozhnikov
相关产品推荐
相关产品推荐

