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

Android 13中添加.nomedia文件导致获权应用无法访问媒体文件的问题及解决方案咨询

Android 13中添加.nomedia文件导致获权应用无法访问媒体文件的问题及解决方案咨询

我最近碰到一个特别困扰的问题:当我的应用通过Storage Access Framework(SAF)获得某个含有媒体文件的文件夹的读写权限后,只要在该文件夹里添加.nomedia文件,应用就再也访问不到里面的媒体文件了。按道理来说,.nomedia应该只是把媒体文件从图库或其他媒体类应用中隐藏,而不是阻止已经获得权限的应用本身访问这些资源啊,而且在SAF出现之前,.nomedia的行为一直是符合预期的。

问题复现步骤:

  • 在应用内选择一个包含媒体文件的文件夹,授予应用读写权限
  • 确认此时应用可以正常读取该文件夹内的媒体文件
  • 手动在该文件夹中添加.nomedia文件
  • 返回应用,发现原本可访问的媒体文件已经无法被读取

设备与系统信息:

  • 设备:Pixel 7 Pro
  • 操作系统:Android 13

LogCat报错信息:

Permission to access file: /storage/emulated/0/XX/1705.jpg is denied
Unable to decode stream: java.io.FileNotFoundException: /storage/emulated/0/XX/NRCTOPO/03/11E5/1705.jpg: open failed: EACCES (Permission denied)

有没有开发者遇到过类似的问题?或者有什么可行的解决方案吗?

以下是我用于选择文件夹并获取权限的核心代码:

// 通过选择器选取文件夹
Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT_TREE);
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION
        | Intent.FLAG_GRANT_WRITE_URI_PERMISSION
        | Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION
        | Intent.FLAG_GRANT_PREFIX_URI_PERMISSION
);
activity.startActivityForResult(intent, SELECT_FOLDER);

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (data != null) {
        Bundle extras = data.getExtras();
        switch(requestCode) {
            case SELECT_FOLDER:
                Uri uri = data.getData();
                getContentResolver().takePersistableUriPermission(uri,
                        Intent.FLAG_GRANT_READ_URI_PERMISSION
                                |Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
                break;
        }
    }
}

备注:内容来源于stack exchange,提问作者MuskokaGeek

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.22 09:29:28