首页 > 解决方案 > 访问 Android 11 中 Android/media 文件夹中其他应用程序的文件和文件夹的权限是什么?

问题描述

我想请求在 Android 11 中访问文件(但不是所有文件访问)的权限。我可以请求照片和媒体的权限,但不能请求文件的权限。如果我使用 MANAGE_EXTERNAL_STORAGE 权限,playstore 会拒绝应用。有人可以帮忙吗?

标签: javaandroidandroid-11

解决方案


您可以授予对目录内容的访问权限

脚步:

  • 检查用户是否具有文件夹的授予权限

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

推荐阅读