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

Android中如何通过Java判断Activity Intent是否成功捕获图片

判断Android拍照Intent是否成功捕获图片

要判断图片是否成功捕获,核心是处理拍照Intent的返回结果,分两种实现方案:

一、旧版 startActivityForResult 方案

你已经调用了 startActivityForResult,接下来需要在Activity或Fragment中重写 onActivityResult 方法,通过返回码和文件状态判断:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == CAPTURE_IMAGE_REQUEST_ID) {
        // 先判断系统返回的结果码
        if (resultCode == RESULT_OK) {
            // 验证目标文件有效性(避免用户拍照后取消导致空文件)
            File imageFile = new File(path);
            if (imageFile.exists() && imageFile.length() > 0) {
                // 图片捕获成功,处理业务逻辑
            } else {
                // 文件无效,清理临时文件并处理失败
                if (imageFile.exists()) {
                    imageFile.delete();
                }
            }
        } else if (resultCode == RESULT_CANCELED) {
            // 用户主动取消,清理临时文件
            File imageFile = new File(path);
            if (imageFile.exists()) {
                imageFile.delete();
            }
        } else {
            // 其他异常情况,清理临时文件
            File imageFile = new File(path);
            if (imageFile.exists()) {
                imageFile.delete();
            }
        }
    }
}

二、新版 Activity Result API 方案(推荐)

从AndroidX开始,官方推荐用Activity Result API替代startActivityForResult,代码更简洁且生命周期更安全:

  1. 先在Activity/Fragment中注册拍照契约:
private ActivityResultLauncher<Uri> takePictureLauncher;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    // 初始化拍照启动器
    takePictureLauncher = registerForActivityResult(
        new ActivityResultContracts.TakePicture(),
        success -> {
            if (success) {
                // 系统返回成功,但仍需验证文件
                File imageFile = new File(path);
                if (imageFile.exists() && imageFile.length() > 0) {
                    // 图片确实捕获成功,处理业务逻辑
                } else {
                    // 文件无效,清理临时文件
                    imageFile.delete();
                }
            } else {
                // 用户取消或拍照失败,清理临时文件
                File imageFile = new File(path);
                if (imageFile.exists()) {
                    imageFile.delete();
                }
            }
        }
    );
}
  1. 修改启动函数,用启动器替代startActivityForResult:
private void launchTakeImageWithCameraIntent() {
    File imageFile = createTemporaryWritableImageFile();
    path = imageFile.getPath();

    // Android 7.0+ 必须用FileProvider生成Uri,避免FileUriExposedException
    Uri imageUri = getUriForFile(this, "你的应用包名.fileprovider", imageFile);
    
    try {
        takePictureLauncher.launch(imageUri);
    } catch (Exception e) {
        try {
            if (!imageFile.delete()) {
                throw new RuntimeException("failed to delete image file.");
            }
        } catch (SecurityException exception) {
            exception.printStackTrace();
        }
        result.error(
            "no_available_activity",
            "no camera available for taking picture.",
            null
        );
    }
}

关键注意点

  • 不要只依赖系统返回的RESULT_OK或success布尔值:部分相机应用在用户取消时可能仍创建空文件,必须验证文件存在且大小大于0。
  • Android 7.0及以上必须使用FileProvider生成Uri,不能直接用Uri.fromFile,否则会抛出FileUriExposedException,需在Manifest中配置FileProvider。
  • 无论成功失败,及时清理无效临时文件,避免占用存储。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 15:37:51