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

Android模拟器Camera预览黑屏问题求助(附复现代码)

问题排查与修复方案

核心问题定位

你遇到的黑屏问题直接原因是:相机生命周期绑定阶段,仅关联了ImageAnalysis条码分析组件,没有将创建好的cameraPreview预览组件绑定进去。虽然相机被成功调用(摄像头指示灯亮),但预览画面没有输出到PreviewView组件上。


分步修复方案

1. 修复相机绑定逻辑

修改processCameraProvider.bindToLifecycle方法,将cameraPreview加入绑定参数,让相机输出同时关联预览和分析组件:

// 原代码
processCameraProvider.bindToLifecycle(this, cameraSelector, imageAnalysis);

// 修改后
processCameraProvider.bindToLifecycle(this, cameraSelector, cameraPreview, imageAnalysis);

2. 补全权限申请回调

当前代码未处理权限授权后的初始化逻辑,用户首次授权相机权限后,点击按钮前无法触发相机初始化。重写权限回调方法:

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    if (requestCode == 0) {
        if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
            // 权限通过后直接初始化相机
            initBarcodeScanner(findViewById(R.id.camera_preview));
        }
    }
}

3. 适配模拟器相机映射逻辑

Android模拟器默认将本地摄像头映射为前置相机,而你代码中强制指定了后置相机,可能导致无法获取画面。可改为优先适配前置,或动态检测可用相机:

// 方案1:直接切换为前置相机
cameraSelector = new CameraSelector
        .Builder()
        .requireLensFacing(CameraSelector.LENS_FACING_FRONT)
        .build();

// 方案2:动态检测可用相机(更健壮)
List<CameraInfo> cameraInfos = processCameraProvider.getAvailableCameraInfos();
for (CameraInfo info : cameraInfos) {
    if (info.hasLensFacing(CameraSelector.LENS_FACING_BACK)) {
        cameraSelector = new CameraSelector.Builder().requireLensFacing(CameraSelector.LENS_FACING_BACK).build();
        break;
    } else if (info.hasLensFacing(CameraSelector.LENS_FACING_FRONT)) {
        cameraSelector = new CameraSelector.Builder().requireLensFacing(CameraSelector.LENS_FACING_FRONT).build();
        break;
    }
}

4. 优化画面旋转适配

不要硬编码Surface.ROTATION_0,使用PreviewView的实际显示旋转角度,确保画面方向正确:

imageAnalysis = new ImageAnalysis
        .Builder()
        .setTargetRotation(previewView.getDisplay().getRotation())
        .build();

5. 避免内存泄漏

添加Activity销毁时的线程池关闭逻辑:

// 先将cameraExecutor改为成员变量
private ExecutorService cameraExecutor;

// 重写onDestroy
@Override
protected void onDestroy() {
    super.onDestroy();
    if (cameraExecutor != null) {
        cameraExecutor.shutdown();
    }
}

内容的提问来源于stack exchange,提问作者user20958695

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 03:43:34