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

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

请问这是什么原因?


原因分析与解决方案

核心原因

  1. Android 10分区存储机制的影响
    Android 10(API 29)引入了分区存储(Scoped Storage),即使你的targetSdkVersion低于29,系统也会默认启用部分限制。此时WRITE_EXTERNAL_STORAGE权限的行为被改变:即使声明并申请该权限,也无法随意访问外部存储的任意位置,仅能访问应用私有目录和媒体文件。

  2. 权限申请逻辑不匹配需求
    你的代码仅申请了READ_EXTERNAL_STORAGE,但应用实际需要的是WRITE_EXTERNAL_STORAGE。在Android 6-9中,申请写权限会自动授予读权限,但反过来不成立;而Android 10及以上,仅申请读权限无法获得写操作的能力。

  3. 低targetSdkVersion的兼容限制
    虽然targetSdkVersion=27,但Android 10会对低版本target的应用施加分区存储的部分限制,导致传统权限逻辑不符合预期。

解决方案

  1. 修正权限申请逻辑
    直接申请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();
}
  1. 临时禁用分区存储限制
    如果需要访问外部存储任意位置,在Manifest的<application>标签中添加属性,仅适用于targetSdkVersion < 30的情况:
<application
    ...
    android:requestLegacyExternalStorage="true">
    ...
</application>
  1. 长期适配方案
    建议升级compileSdkVersion和targetSdkVersion到30及以上,适配分区存储:
  • 访问应用私有目录:使用getExternalFilesDir()等方法,无需权限。
  • 访问媒体文件:使用MediaStore API,Android 10+无需WRITE_EXTERNAL_STORAGE权限。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 02:05:16