Android 11 引入了强制执行分区存储的限制,导致应用默认不能访问外部文件。
针对以前涉及较多文件的操作,可采用申请所有文件访问权限的方式来解决这一问题,实现方式如下。
(虽然这样做安全性低,官方并不推荐这样,但确实最快适配原有应用程序的方式)
1. AndroidManifest.xml中添加如下内容:
用于声明应用程序需要使用 MANAGE_EXTERNAL_STORAGE 权限。同时,使用了 tools:ignore=“ScopedStorage” 来忽略与分区存储(Scoped Storage)相关的 Lint 检查。
<!-- Android11额外添加 -->
<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE"tools:ignore="ScopedStorage" />
2. 申请所有文件访问权限,该操作会跳转到所有文件权限申请页面
// 请求文件访问权限的请求码,可以是任意整数值private static final int REQUEST_MANAGE_FILES_ACCESS = 2;//申请所有文件访问权限public void requestPermission() {if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {//判断是否有管理外部存储的权限if (!Environment.isExternalStorageManager()) {Intent intent = new Intent(Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION);intent.setData(Uri.parse("package:" + getPackageName()));startActivityForResult(intent, REQUEST_MANAGE_FILES_ACCESS);} else {// TODO: 2023/11/22 // 已有所有文件访问权限,可直接执行文件相关操作}} else {// TODO: 2023/11/22 //非android11及以上版本,走正常申请权限流程}}
3. 获取用户授权情况
@Overrideprotected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {super.onActivityResult(requestCode, resultCode, data);if (requestCode == REQUEST_MANAGE_FILES_ACCESS) {if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {if (Environment.isExternalStorageManager()) {// TODO: 2023/11/22 // 用户已经授予文件访问权限// 在这里执行创建文件夹和初始化数据库的操作} else {// TODO: 2023/11/22 // 用户尚未授予文件访问权限// 可以在此处处理用户未授予权限的情况}}}}