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

Android原生如何监听其他Activity的Intent数据?相机返回Intent为空

问题解决方案

一、相机返回Intent为空的原因与解决

当你通过MediaStore.EXTRA_OUTPUT指定了图片保存路径时,Android系统的相机Activity不会在返回的Intent中携带图片数据,这是系统设计规则,并非异常。你需要直接使用启动相机前创建的临时文件来获取拍摄后的图片,无需依赖返回的data参数。

代码修改示例

  1. 先保存临时文件的路径到成员变量:
public class MyPlugin implements FlutterPlugin, MethodCallHandler, ActivityAware,
        PluginRegistry.ActivityResultListener {

  private Activity activity;
  private String capturedImagePath; // 新增成员变量保存图片路径
  private static final int CAPTURE_IMAGE_REQUEST_ID = 1001;

  @Override
  public void onAttachedToActivity(@NonNull ActivityPluginBinding binding) {
    activity = binding.getActivity();
    binding.addActivityResultListener(this);
    // 移除无用的NewIntentListener注册
  }

  private void launchTakeImageWithCameraIntent() {
    Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
    File imageFile = createTemporaryWritableImageFile();
    capturedImagePath = imageFile.getAbsolutePath(); // 保存文件路径
    Uri imageUri = FileProvider.getUriForFile(
            activity, "com.example.FileProvider", imageFile);
    intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
    grantUriPermissions(intent, imageUri);

    try {
      activity.startActivityForResult(intent, CAPTURE_IMAGE_REQUEST_ID);
    } catch (ActivityNotFoundException e) {
      // 处理相机不存在的异常
    }
  }
  1. 在结果处理方法中直接使用保存的路径:
private void handleCaptureResult(int resultCode, @Nullable Intent data) {
    if (resultCode == Activity.RESULT_OK) {
      // 直接通过路径读取图片,忽略data参数
      if (capturedImagePath != null) {
        File capturedImage = new File(capturedImagePath);
        // 此处添加图片后续处理逻辑,比如转成Bitmap或上传
      }
    } else if (resultCode == Activity.RESULT_CANCELED) {
      // 用户取消拍摄,清理临时文件
      if (capturedImagePath != null) {
        new File(capturedImagePath).delete();
        capturedImagePath = null;
      }
    }
  }

  @Override
  public boolean onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
    switch (requestCode) {
      case CAPTURE_IMAGE_REQUEST_ID:
        handleCaptureResult(resultCode, data);
        return true;
      default:
        return false;
    }
  }

  // 移除无用的onNewIntent方法
}

二、关于监听其他Activity的Intent数据

  • onNewIntent方法仅适用于单Task模式(如singleTop、singleTask)的Activity接收新启动Intent的场景,和相机这类独立Activity的返回结果无关,你之前实现的PluginRegistry.NewIntentListener完全可以删除。
  • 监听普通Activity的返回结果,只需通过ActivityResultListener注册onActivityResult回调,根据requestCode区分不同请求的结果即可,无需额外处理。

额外注意事项

  • 确保createTemporaryWritableImageFile方法使用应用私有目录创建文件,比如activity.getExternalFilesDir(Environment.DIRECTORY_PICTURES),避免权限问题。
  • Android 9及以下系统需要提前申请WRITE_EXTERNAL_STORAGE权限,Android 10及以上无需此权限。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 02:27:21