CameraX imageCapture.takePicture在Android 12设备上无法正常工作
CameraX拍照功能Android 12适配问题
问题现象
- 基于CameraX实现的拍照逻辑,在Android 12以下版本设备可正常运行
- Android 12设备上触发拍照后,既不触发
onImageSaved成功回调,也不触发onError错误回调,在错误回调处设置断点无法命中,无法直接定位异常原因
问题对应实现代码如下:
long x = System.currentTimeMillis(); String fileName = getExternalFilesDir(null) + "" + x + ".jpg"; File file = new File(fileName); ImageCapture.OutputFileOptions outputFileOptions = new ImageCapture.OutputFileOptions.Builder(file).build(); imageCapture.takePicture(outputFileOptions, executor, new ImageCapture.OnImageSavedCallback() { @Override public void onImageSaved(@NonNull ImageCapture.OutputFileResults outputFileResults) { Log.e("xxxx", "yyy"); new Handler(Looper.getMainLooper()).post(new Runnable() { @Override public void run() { Toast.makeText(MainActivity.this, "Image Saved successfully", Toast.LENGTH_SHORT).show(); } }); } @Override public void onError(@NonNull ImageCaptureException error) { error.printStackTrace(); } });
修复方案
按优先级逐一排查修复即可:
- 修复文件路径拼接错误:现有代码拼接存储路径时漏掉了文件分隔符,
getExternalFilesDir(null)返回的路径末尾不带路径分隔符,直接拼接时间戳会导致文件生成在files目录的同级路径而非目录内部,Android 12对目录访问权限管控更严格,这种非法路径写入会导致IO流程阻塞无响应。修改路径拼接逻辑:
// 补充File.separator作为目录分隔符 String fileName = getExternalFilesDir(null) + File.separator + x + ".jpg";
- 升级CameraX依赖版本:1.0.2以下的CameraX版本存在Android 12平台兼容bug,会出现拍照无回调的问题,将CameraX核心库(camera-camera2、camera-lifecycle、camera-view)升级到1.0.2及以上稳定版本即可修复该系统版本兼容问题。
- 校验传入的executor有效性:不要传入被阻塞、已关闭的自定义线程池executor,可先替换为主线程executor做验证:
ContextCompat.getMainExecutor(MainActivity.this),确认回调正常触发后再根据业务需求切换为后台线程executor。 - 检查清单文件配置:如果项目
targetSdkVersion升级到31,需要给所有包含intent-filter的组件(包括CameraX依赖中涉及的相机相关组件)显式声明android:exported属性,避免服务绑定失败导致拍照流程卡住无回调。
内容的提问来源于stack exchange,提问作者Lahiru Prasanna
相关产品推荐
相关产品推荐

