在Android 10中,需要访问存储器的应用程序需要请求访问具体路径的权限。但是像文件浏览器这样的应用程序可以请求访问根存储器的权限,并获得读写所有存储器的权限。那就是我想做的。
根据Android的规定,我们必须使用 ACTION_OPEN_DOCUMENT_TREE
来实现这一点。我的问题是,虽然一切似乎都正确,但是该应用程序未被授予权限。
private void askAndroid10Perm()
{
Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT_TREE);
intent.addFlags(
Intent.FLAG_GRANT_READ_URI_PERMISSION
| Intent.FLAG_GRANT_WRITE_URI_PERMISSION
| Intent.FLAG_GRANT_PERSISTABLE_URI_PERMISSION
| Intent.FLAG_GRANT_PREFIX_URI_PERMISSION);
startActivityForResult(intent, REQUEST_CODE_OPEN_DOCUMENT_TREE);
}
用户可以在这里查看Android文件树,并选择主存储,点击授权。"这将允许 - 应用程序名称 - 对当前存储在此位置下的所有文件以及未来存储在此处的任何内容拥有完全访问权限"-> 允许
然后:
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
switch (requestCode) {
case REQUEST_CODE_OPEN_DOCUMENT_TREE:
if (resultCode == Activity.RESULT_OK) {
Uri treeUri = data.getData();
int takeFlags = data.getFlags();
takeFlags &= (Intent.FLAG_GRANT_READ_URI_PERMISSION |
Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
Log.i("TAG", "takePersistableUriPermission: " + treeUri);
this.getContentResolver().takePersistableUriPermission(treeUri, takeFlags);
}
}
}
}
日志:
takePersistableUriPermission: content://com.android.externalstorage.documents/tree/primary%3A
那么该应用程序仍然没有访问根目录的权限。
open failed: EACCES(拒绝访问权限)
当然我已经具备了:
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
由用户授权。