Android R及以上版本中APP外部存储实现

背景:

从 Android R开始,Google 引入了一些新的限制,以增强用户数据的隐私保护。其中之一是对外部存储的访问限制。如果APP的target>30,之前的WRITE_EXTERNAL_STORAGE/READ_EXTERNAL_STORAGE授权方案就完全不能使用了。本文将说明如何在 Android R及以上版本中实现外部存储空间的读写。

APP中实现在Android R及以上版本中外部存储路径下的读写方案,步骤概述如下:

|----|------------------------------------|
| 步骤 | 描述 |
| 1 | 检查应用是否运行在 Android 11 上 |
| 2 | 请求 MANAGE_EXTERNAL_STORAGE 权限 |
| 3 | 检查是否已获得 MANAGE_EXTERNAL_STORAGE 权限 |
| 4 | 获取外部存储路径 |

详细步骤如下:

步骤 1: 检查应用是否运行在 Android 11 上

在 AndroidManifest.xml 文件中添加以下代码,以指定应用的目标 SDK 版本为 30(Android 11):

XML 复制代码
<uses-sdk android:minSdkVersion="..." android:targetSdkVersion="30" />

步骤 2: 请求 MANAGE_EXTERNAL_STORAGE 权限

在 AndroidManifest.xml 文件中添加以下代码,以请求 MANAGE_EXTERNAL_STORAGE 权限:

XML 复制代码
<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" />

为了兼容Android R之前的版本,完整的配置代码如下:

XML 复制代码
<!-- 操作sd卡权限 -->
<uses-permission android:name="android.permission.READ_MEDIA_IMAGES"
    tools:ignore="SelectedPhotoAccess" />
<uses-permission android:name="android.permission.READ_MEDIA_AUDIO" />
<uses-permission android:name="android.permission.READ_MEDIA_VIDEO"
    tools:ignore="SelectedPhotoAccess" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"
    android:maxSdkVersion="32"
    tools:ignore="ScopedStorage" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"
    android:maxSdkVersion="32" />
<uses-permission android:name="android.permission.WRITE_MEDIA_STORAGE"
    tools:ignore="ProtectedPermissions" />
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"
    tools:ignore="ProtectedPermissions" />
<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE"
    tools:ignore="ScopedStorage" />

步骤 3: 检查是否已获得 MANAGE_EXTERNAL_STORAGE 权限

在你需要访问外部存储路径的地方,添加以下代码,以检查是否已获得 MANAGE_EXTERNAL_STORAGE 权限:

java 复制代码
if (Environment.isExternalStorageManager()) {
    // 已获得权限,可以访问外部存储路径
} else {
    // 未获得权限,需要请求权限
    Intent intent = new Intent(Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION)
        .setData(Uri.parse("package:"+getPackageName()));
    startActivityForResult(intent, 0);
}

步骤 4: 获取外部存储路径

在你需要获取外部存储路径的地方,添加以下代码,以获取外部存储路径:

java 复制代码
File externalStorageDirectory = Environment.getExternalStorageDirectory();
String externalStoragePath = externalStorageDirectory.getAbsolutePath();

总结

通过以上步骤,就可以在 Android 11 中实现外部存储路径的访问。首先,需要检查应用的目标 SDK 版本是否为 Android 11及以上版本,然后请求 MANAGE_EXTERNAL_STORAGE 权限并检查是否已获得该权限,最后可以使用 Environment.getExternalStorageDirectory() 方法获取外部存储路径。

需要注意的是:从 Android 11 开始,外部存储路径不再是应用的专属目录,而是共享的目录。因此,对于敏感数据,建议将其存储在应用的内部目录中,而不是外部存储路径。

相关推荐
小谢小哥1 分钟前
63-Gradle构建详解
java·后端·架构
Sam_Deep_Thinking1 分钟前
一个业务场景只需要一个ThreadLocal实例
java·面试
超梦dasgg5 分钟前
Dijkstra(迪杰斯特拉)算法详解
java·数据结构·算法
MacroZheng6 分钟前
给Claude Code装上这个超酷的状态栏,瞬间高大上了!
java·人工智能·后端
有梦想的程序星空9 分钟前
【环境配置】IDEA+Scala 项目 JAR 打包异常完整排查指南
java·ide·intellij-idea
小程故事多_8015 分钟前
从初代架构到大模型时代,英伟达GPU底层架构演进与核心逻辑深度解析
java·人工智能·分布式·架构
码云骑士15 分钟前
Android ART运作流程
android
组合缺一19 分钟前
Solon 热加载与插件热插拔:Debug 模式 × E-Spi × H-Spi 全解析
java·solon·插件·plugin·热插拨
MageGojo19 分钟前
Whois 域名查询 API 接入实战:用一个 GET 请求获取域名注册信息
java·git·github
MandalaO_O20 分钟前
SpringMVC:框架搭建、核心配置与前后端交
java