You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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);
    }
}

现在我希望将应用改为仅支持竖屏模式,已执行以下操作:

  1. 将AndroidManifest中android:screenOrientation改为portrait,此时相机分辨率变为1920x1920;
  2. 修改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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 16:37:44