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

使用registerActivityForResult调用相机返回intentData为null求助

问题根源

你在启动相机的Intent中传入了MediaStore.EXTRA_OUTPUT参数,按照Android系统的相机调用规范,只要你指定了输出路径,系统就会直接将拍摄完成的照片写入你提供的Uri,不会再返回任何携带数据的Intent,因此intentData为null是正常预期行为,和你使用的调用器无关。


修复方案

  1. 首先将你生成的拍照输出Uri提升为类成员变量,方便在结果回调中直接访问
// 类成员变量,保存拍照输出的Uri
private Uri cameraOutputUri;
  1. 调整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 );
}
  1. 调整结果回调逻辑,直接使用提前生成的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 14:42:03