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

Poco X3设备某安卓应用相机无法工作,报CaptureRequest空指针异常

Poco X3设备相机空指针异常修复方案

错误根因:你遇到的NullPointerException不是代码中声明的mCameraView为空,而是你使用的CameraView封装库内部调用Camera2 API的CaptureRequest.Builder.set()方法时,Builder实例未初始化完成就被调用。该问题在Poco X3的MIUI系统上高发,原因是MIUI对相机硬件调用做了自定义校验,相机会话初始化耗时比原生安卓更长,未初始化完成时操作闪光灯、拍照、切换镜头都会触发该异常。


具体修复步骤

1. 修复onPause方法空指针风险

现有代码直接调用mCameraView.stop()未做判空,权限申请未通过、页面快速退出时容易触发空指针,修改如下:

@Override
protected void onPause() {
    if (mCameraView != null) {
        mCameraView.stop();
    }
    super.onPause();
}

2. 相机启动加延迟适配MIUI校验

Poco X3的MIUI系统获取相机权限后需要等待100-200ms再启动相机,否则Camera2会话初始化失败会导致Builder为空,修改onResume中相机启动逻辑:

if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA) == PackageManager.PERMISSION_GRANTED) {
    if (mCameraView != null) {
        // 适配Poco X3 MIUI相机初始化延迟特性
        handler.postDelayed(() -> mCameraView.start(), 150);
    }
}

3. 新增相机可用状态校验,禁止未初始化完成时操作相机

新增成员变量标记相机状态:

private boolean isCameraOpened = false;

在CameraView.Callback中更新状态:

@Override
public void onCameraOpened(CameraView cameraView) {
    Log.d(TAG, "onCameraOpened");
    isCameraOpened = true;
}

@Override
public void onCameraClosed(CameraView cameraView) {
    Log.d(TAG, "onCameraClosed");
    isCameraOpened = false;
}

所有操作相机的位置都新增状态判断:

  • 拍照逻辑
case R.id.take_picture:
    if (mCameraView != null && isCameraOpened) {
        try {
            mCameraView.takePicture();
        }catch (Exception e){
            Log.e(TAG,"mCameraView"+e.toString());
        }
    }
    break;
  • 切换闪光灯逻辑
case R.id.switch_flash:
    if (mCameraView != null && isCameraOpened) {
        mCurrentFlash = (mCurrentFlash + 1) % FLASH_OPTIONS.length;
        item.setTitle(FLASH_TITLES[mCurrentFlash]);
        item.setIcon(FLASH_ICONS[mCurrentFlash]);
        mCameraView.setFlash(FLASH_OPTIONS[mCurrentFlash]);
    }
    return true;
  • 切换前后置镜头逻辑
case R.id.switch_camera:
    if (mCameraView != null && isCameraOpened) {
        try {
            int facing = mCameraView.getFacing();
            mCameraView.setFacing(facing == CameraView.FACING_FRONT ? CameraView.FACING_BACK : CameraView.FACING_FRONT);
        }catch (Exception e){
            e.printStackTrace();
        }
    }
    return true;
  • 调整画面比例逻辑
@Override
public void onAspectRatioSelected(@NonNull AspectRatio ratio) {
    if (mCameraView != null && isCameraOpened) {
        try {
            mCameraView.setAspectRatio(ratio);
        }catch (Exception e){
            Log.d(TAG,"onAspectRatioSelected"+e.toString());
        }
    }
}

4. 新增MIUI专属相机权限声明

在AndroidManifest.xml中添加MIUI自定义相机权限,规避系统权限拦截:

<uses-permission android:name="miui.permission.USE_CAMERA" />

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 11:30:02