Google 自 Android 11 起对 Android/data 目录的访问做了一些限制,不再能直接使用 File 进行操作,而在 Android 11 及 Android 12 上,我们通过 DocumentFile 来读写此目录
获取到 Android/data 目录的权限后,便可以使用 DocumentFile 类中的方法对文件进行操作及使用openInputStream/openOutputStream进行文件读/写
DocumentFile类文档:https://developer.android.google.cn/reference/androidx/documentfile/provider/DocumentFile
而在 Android 13上,Google 做出了限制,我们不再能获取到 Android/data 目录的权限,但又似乎特地留下了“漏洞”,我们可以获取到其子目录的权限
所以,想要在 Android 13 上实现读写,应该获取其子目录的权限
在 Android 11 更新后,iApp 给出了读写实例,其授权代码如下:
Intent intent = new Intent("android.intent.action.OPEN_DOCUMENT_TREE");
intent.setFlags(195);
intent.putExtra("android.provider.extra.INITIAL_URI", Uri.parse("content://com.android.externalstorage.documents/tree/primary%3AAndroid%2Fdata/document/primary%3AAndroid%2Fdata"));
startActivityForResult(intent, 0);
我们只需要改为:
Intent intent = new Intent("android.intent.action.OPEN_DOCUMENT_TREE");
intent.setFlags(195);
intent.putExtra("android.provider.extra.INITIAL_URI", DocumentFile.fromTreeUri(activity, Uri.parse("content://com.android.externalstorage.documents/tree/primary%3AAndroid%2Fdata%2Fcom.xxx.xxx")).getUri());
startActivityForResult(intent, 0);
即可获取 Android/data 目录下 com.xxx.xxx 的权限,进而对其内部文件进行操作
我知道很多人比较懒,demo 已经上传到 iApp 的共享空间,可自行下载[doge]