使用registerActivityForResult调用相机返回intentData为null求助
问题根源
你在启动相机的Intent中传入了MediaStore.EXTRA_OUTPUT参数,按照Android系统的相机调用规范,只要你指定了输出路径,系统就会直接将拍摄完成的照片写入你提供的Uri,不会再返回任何携带数据的Intent,因此intentData为null是正常预期行为,和你使用的调用器无关。
修复方案
- 首先将你生成的拍照输出Uri提升为类成员变量,方便在结果回调中直接访问
// 类成员变量,保存拍照输出的Uri private Uri cameraOutputUri;
- 调整
takePhoto()方法中Uri赋值逻辑,同时给Intent加临时写入权限,避免部分机型相机无法写入文件
private void takePhoto() { String uuid = UUID.randomUUID().toString(); File outputDir = getCacheDir(); File file; try { file = File.createTempFile( uuid, ".jpg", outputDir ); } catch( IOException e ) { return; } Intent intent = new Intent( android.provider.MediaStore.ACTION_IMAGE_CAPTURE ); try { cameraOutputUri = FileProvider.getUriForFile( Objects.requireNonNull( getApplicationContext()), BuildConfig.APPLICATION_ID + ".fileProvider", file ); } catch( IllegalArgumentException e ) { return; } intent.putExtra( MediaStore.EXTRA_OUTPUT, cameraOutputUri ); // 给相机授予文件写入权限 intent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION); activityLauncher.launch( intent ); }
- 调整结果回调逻辑,直接使用提前生成的
cameraOutputUri即可,不需要读取返回的Intent数据
activityLauncher.setOnActivityResult( result -> { if( result.getResultCode() != RESULT_OK ) { cameraOutputUri = null; return; } if(cameraOutputUri != null) { Log.e("URI",cameraOutputUri.toString()); // 需要Bitmap的话直接从uri读取即可 Bitmap bmp = MediaStore.Images.Media.getBitmap(getContentResolver(), cameraOutputUri); // 后续业务逻辑 } } );
额外注意事项
EXTRA_OUTPUT和返回Intent携带缩略图的逻辑是互斥的,只要你指定了输出路径,系统就不会再返回任何额外数据,不需要再做intentData非空判断。
内容的提问来源于stack exchange,提问作者HemmaRoyD
相关产品推荐
相关产品推荐

