Android11下targetSdk=30应用获取/storage子列表始终返回null求助
解决方案
核心原因
Android 11(API 30)的分区存储机制中,MANAGE_EXTERNAL_STORAGE 属于特殊的「所有文件访问权限」,仅在AndroidManifest.xml中声明不会自动生效,必须完成权限授予后才能访问/storage这类公共根目录。普通存储权限WRITE_EXTERNAL_STORAGE在API 30及以上版本已经失效,不会对全目录访问产生作用。
操作步骤
- 方案一:手动授予权限(适合内部测试场景,无需修改代码)
进入系统设置 → 应用 → 找到你的应用 → 权限管理 → 找到「存储」相关权限分类 → 选择「允许访问所有文件」即可。 - 方案二:代码引导申请权限(适合常规使用场景)
在调用目录读取代码前,先判断并触发权限申请流程,Kotlin示例代码如下:if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { // 检查是否已经获得所有文件访问权限 if (!Environment.isExternalStorageManager()) { // 跳转系统权限授予页引导用户开启 val intent = Intent(Settings.ACTION_MANAGE_ALL_FILES_ACCESS_PERMISSION) startActivity(intent) } else { // 已授权,直接读取目录 val childList = Environment.getStorageDirectory().list() // 后续处理逻辑 } }
注意:上述逻辑对Android 12、13、14版本完全兼容,无需额外适配。
内容的提问来源于stack exchange,提问作者emusute
相关产品推荐
相关产品推荐

