java - 访问 Android 11 中 Android/media 文件夹中其他应用程序的文件和文件夹的权限是什么?
问题描述
我想请求在 Android 11 中访问文件(但不是所有文件访问)的权限。我可以请求照片和媒体的权限,但不能请求文件的权限。如果我使用 MANAGE_EXTERNAL_STORAGE 权限,playstore 会拒绝应用。有人可以帮忙吗?
解决方案
您可以授予对目录内容的访问权限
脚步:
- 检查用户是否具有文件夹的授予权限
private fun hasPermission() = run {
try {
val uri = PreferenceUtil.getString(PreferenceKey.TREE_URI).toUri()
DocumentFile.fromTreeUri(requireContext(), uri)?.canWrite()
} catch (e:Exception) {
false
}
}
爪哇
private boolean hasPermission() {
try {
SharedPreferences preferences = this.getPreferences(MODE_PRIVATE);
String treeUri = preferences.getString(PreferenceKey.TREE_URI, "");
Uri uri = Uri.parse(treeUri);
return DocumentFile.fromTreeUri(this, uri).canWrite();
} catch (Exception e) {
return false;
}
}
- 请求访问文件夹权限
private val SELECT_TREE_FOLDER: Int = 100
val intent = Intent(Intent.ACTION_OPEN_DOCUMENT_TREE)
startActivityForResult(intent, SELECT_TREE_FOLDER)
- 用户选择文件夹后,授予读写权限并将treeUri存储到SharePreference
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
if (resultCode != Activity.RESULT_OK) return
if (requestCode == SELECT_TREE_FOLDER) {
val treeUri = data?.data ?: return
if (DocumentFile.fromTreeUri(requireContext(), treeUri)?.canWrite() == true) {
var takeFlags = data.flags
takeFlags =
takeFlags and (Intent.FLAG_GRANT_READ_URI_PERMISSION or Intent.FLAG_GRANT_WRITE_URI_PERMISSION)
requireContext().contentResolver.takePersistableUriPermission(treeUri, takeFlags)
PreferenceUtil[PreferenceKey.TREE_URI] = treeUri.toString()
}
}
}
- 用户授予权限后,您可以读取该文件夹中所有文件的内容。
推荐阅读
- c# - 如何在机器人框架中为 MS 团队垂直堆叠自适应卡片中的按钮
- amazon-web-services - 当公共 VPC 只有 Fargate 容器时,在私有 VPC 中达到 RDS
- android - RXBle 开始扫描不适用于 Android 10(华为 P30)
- javascript - 未捕获(承诺中)错误:第 1 行有 42 列,但必须有 2
- scala - Scala - 如何避免对象工厂的 if/else 条件
- sql - SQL Server Pivot/Map 列值到行
- asp.net-core - 为什么在将我的项目移动到新机器时需要安装 EntityFrameworkCore nuget 包?
- android - TextInputLayout 以编程方式更改 boxStrokeColor
- c - 分段故障铿锵
- java - 倒数计时器似乎在后台运行,即使我在方向更改后暂停它(纵向到横向,反之亦然)