READ_EXTERNAL_STORAGE在Android7正常,Android10无法获取权限咨询
问题描述
我的应用需要WRITE_EXTERNAL_STORAGE权限,以下代码在Android 7(API Level 25)上运行无问题:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, READ_PERMISSION_CHECK); else continueLoading(); } else { continueLoading(); }
但相同代码在Android 10(API Level 29)上无法获取权限。我的Manifest文件中已声明以下权限:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
补充配置信息:
compileSdkVersion 27 buildToolsVersion '27.0.3' minSdkVersion 19 targetSdkVersion 27
请问这是什么原因?
原因分析与解决方案
核心原因
Android 10分区存储机制的影响
Android 10(API 29)引入了分区存储(Scoped Storage),即使你的targetSdkVersion低于29,系统也会默认启用部分限制。此时WRITE_EXTERNAL_STORAGE权限的行为被改变:即使声明并申请该权限,也无法随意访问外部存储的任意位置,仅能访问应用私有目录和媒体文件。权限申请逻辑不匹配需求
你的代码仅申请了READ_EXTERNAL_STORAGE,但应用实际需要的是WRITE_EXTERNAL_STORAGE。在Android 6-9中,申请写权限会自动授予读权限,但反过来不成立;而Android 10及以上,仅申请读权限无法获得写操作的能力。低targetSdkVersion的兼容限制
虽然targetSdkVersion=27,但Android 10会对低版本target的应用施加分区存储的部分限制,导致传统权限逻辑不符合预期。
解决方案
- 修正权限申请逻辑
直接申请WRITE_EXTERNAL_STORAGE权限(因为应用实际需要写能力),修改代码如下:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { String[] permissions = {Manifest.permission.WRITE_EXTERNAL_STORAGE}; if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(this, permissions, READ_PERMISSION_CHECK); } else { continueLoading(); } } else { continueLoading(); }
- 临时禁用分区存储限制
如果需要访问外部存储任意位置,在Manifest的<application>标签中添加属性,仅适用于targetSdkVersion < 30的情况:
<application ... android:requestLegacyExternalStorage="true"> ... </application>
- 长期适配方案
建议升级compileSdkVersion和targetSdkVersion到30及以上,适配分区存储:
- 访问应用私有目录:使用
getExternalFilesDir()等方法,无需权限。 - 访问媒体文件:使用MediaStore API,Android 10+无需
WRITE_EXTERNAL_STORAGE权限。
内容的提问来源于stack exchange,提问作者user1506104
相关产品推荐
相关产品推荐

