如何评价在Android11中,/Android/data文件夹无法读写?

关注者
292
被浏览
988,022

58 个回答

开发者访问安卓11 /android/data的方法

为需要的开发者提供一种访问安卓11的 /adnroid/data文件夹的方法


清浊最新版已经适配安卓11 并且可以免 ROOT 访问 android/data 针对安卓11

希望分享出这种方法 也希望有些人不要再反编译我的代码并抄袭

1.申请android/data的访问权限

使用intent 跳转系统文件管理器到 android/data 并同意你的应用访问这个文件夹

这里是代码

 Uri uri1 = Uri.parse("content://com.android.externalstorage.documents/tree/primary%3AAndroid%2Fdata");
                Intent intent1 = new Intent(Intent.ACTION_OPEN_DOCUMENT_TREE);
                intent1.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION
                        | Intent.FLAG_GRANT_WRITE_URI_PERMISSION
                        | Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION
                        | Intent.FLAG_GRANT_PREFIX_URI_PERMISSION);
                intent1.putExtra(DocumentsContract.EXTRA_INITIAL_URI, uri1);
                startActivityForResult(intent1, 11);

这里的url 是我自己在旧安卓使用文件管理器选择android/data返回的uri 同理 传递这个uri 给文件管理器 自然也会跳转到这文件夹 如果不传递uri 系统文件管理器仍然无法显示 android/data

修改:这里的uri 在后续我发现在部分安卓11 无法正常跳转了 以下是解决方法

使用DocumentFile.fromTreeUri这个方法 获得DocumentFile对象 然后再获取他的uri 传进去就行了 这样就能正常跳转uri 了

如果授权完成 会是这样

后续的检测是否授权android/data 就自行查看谷歌文档吧

2.使用uri 访问 android/data 的文件

如果你现在有一个文件的path 那么这样做可以转为可以访问的uri

String[] paths = path.replaceAll("/storage/emulated/0/Android/data", "").split("/");
        StringBuilder stringBuilder = new StringBuilder("content://com.android.externalstorage.documents/tree/primary%3AAndroid%2Fdata/document/primary%3AAndroid%2Fdata");
        for (String p : paths) {
            if (p.length() == 0) continue;
            stringBuilder.append("%2F").append(p);