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. 申请所有文件访问权限,该操作会跳转到所有文件权限申请页面文章来源:https://www.toymoban.com/news/detail-756396.html
// 请求文件访问权限的请求码,可以是任意整数值
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. 获取用户授权情况文章来源地址https://www.toymoban.com/news/detail-756396.html
@Override
protected 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
// 用户尚未授予文件访问权限
// 可以在此处处理用户未授予权限的情况
}
}
}
}
到了这里,关于android11 申请所有文件访问权限的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!