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

Android 10非废弃方案写入公共DCIM目录及MediaStore使用问题咨询

问题解答

公共DCIM目录写入可行性

可以实现。Android 10及以上版本无需申请特殊存储权限,即可通过MediaStore API在公共DCIM目录下创建自有子目录、写入图片,生成的文件不会随着应用卸载/升级丢失,用户可直接在系统相册、文件管理器中访问导出,完全符合你的业务需求。

非废弃API实现方案

你之前使用getExternalFilesDir拿到的是应用专属外部存储路径,自然会存储到Android/data目录下,要写入公共目录必须使用MediaStore API,你后续调整的技术方向是正确的,当前的报错是代码和流程缺陷导致,不是方案本身不可行。

当前拍照后读Uri报错的原因

你的流程逻辑存在两处问题:

  • 你通过resolver.insert拿到公共目录的Uri后,没有给调用的系统相机App授予该Uri的临时读写权限,导致相机无法将拍摄的照片写入对应路径,你后续读取时自然是空白文件,触发「找不到文件」异常。你需要在启动相机Intent前增加权限授予代码:
List<ResolveInfo> resInfoList = getPackageManager().queryIntentActivities(takePictureIntent, PackageManager.MATCH_DEFAULT_ONLY);
for (ResolveInfo resolveInfo : resInfoList) {
    String packageName = resolveInfo.activityInfo.packageName;
    grantUriPermission(packageName, cameraUri, Intent.FLAG_GRANT_WRITE_URI_PERMISSION | Intent.FLAG_GRANT_READ_URI_PERMISSION);
}
  • 你当前配置的RELATIVE_PATH仅指定了DIRECTORY_DCIM,图片会直接存储到DCIM根目录,要存到你期望的GoTrialImages子目录,需要修改为:
values.put(MediaStore.MediaColumns.RELATIVE_PATH, Environment.DIRECTORY_DCIM + "/GoTrialImages/");

关于处理流程的疑问

你提到的「先在应用私有目录完成所有图片处理,再插入MediaStore并删除临时文件」是更稳妥的实现方案,优势如下:

  • 避免裁剪、旋转等中间处理过程中产生的未完成文件被系统相册扫描,不会出现用户看到无效半截图片的问题
  • 处理过程在应用私有目录进行,不需要额外申请权限,出错也不会在公共存储留下垃圾文件
    你可以按照以下流程调整实现:
  1. 启动相机时,输出路径指定为应用专属外部存储的临时文件,通过FileProvider给相机授予访问权限
  2. 拍照完成后,在回调中读取临时文件,完成裁剪、旋转、压缩等所有处理操作
  3. 处理完成后,将最终的图片文件插入MediaStore公共DCIM目录,插入成功后删除本地临时文件
  4. 后续的上传、本地读取操作可直接使用MediaStore返回的公共Uri

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 09:54:03