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

Android 12下Storage Access Framework/Scoped Storage无法正常使用问题

问题成因

这个异常是Android 12官方设计的隐私保护特性,并非系统Bug,谷歌也没有废弃存储访问框架(SAF)。
Android 12针对SAF的目录访问权限做了收窄,禁止第三方应用通过createOpenDocumentTreeIntent()申请访问以下敏感目录的根路径:

  • 内部存储根目录
  • Download(下载)文件夹根路径
  • Android/data、Android/obb等应用专属目录全层级

用户选择上述目录时就会触发系统提示:“无法使用此文件夹。为保护您的隐私,请选择其他文件夹”,对应效果如下:
问题展示截图

合规解决方案

不需要申请全量存储权限,也不需要引导用户新建文件夹,可通过以下两种方案适配:

方案1:调整SAF调用逻辑,引导用户选择子目录

修改原有SAF调用代码,预先定位到Download目录,引导用户选择Download下的子目录而非根目录,适配代码如下:

/*
* Requests Scoped Storage access authorization
*/
@RequiresApi(Build.VERSION_CODES.Q)
@JvmStatic
fun requestScopedStorageAccess(activity: Activity, requestCode: Int) {
    val storageManager = activity.getSystemService(Context.STORAGE_SERVICE) as StorageManager
    val intent = storageManager.primaryStorageVolume.createOpenDocumentTreeIntent()
    // Android 12及以上预先定位到Download目录,引导用户选择子文件夹
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
        val downloadUri = DocumentsContract.buildDocumentUri(
            "com.android.externalstorage.documents",
            "primary:Download"
        )
        intent.putExtra(DocumentsContract.EXTRA_INITIAL_URI, downloadUri)
    }
    activity.startActivityForResult(intent, requestCode)
}

同时可在用户选择目录后做合法性校验,如果检测到用户选中的是被限制的根目录,提前给用户提示需要选择子文件夹,避免触发系统拦截。

方案2:使用MediaStore API替代SAF(更推荐)

如果你的业务仅需要读写Download目录下的公共媒体文件(图片、音频、视频、普通下载文件等),完全不需要申请SAF目录权限,直接使用MediaStore API即可访问,不需要用户手动授权目录,符合权限最小化原则,适配成本更低。

适配说明

Android 12的存储核心适配规则和Android 11完全一致,仅新增了少量目录访问限制,不需要调整原有适配逻辑,整体适配复杂度不会有明显上升。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 07:45:03