使用哪个权限访问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  
}
}

Java


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()
}
}
}
  • 用户授予权限后,可以读取该文件夹下所有文件的内容。

最新更新