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
相关产品推荐
相关产品推荐

