【发布时间】:2019-12-18 07:52:22
【问题描述】:
在 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);
}
}
}
}
日志:
采取PersistableUriPermission: content://com.android.externalstorage.documents/tree/primary%3A
那么应用程序仍然没有访问root的权限。
打开失败:EACCES(权限被拒绝)
我当然有:
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
由用户授予。
【问题讨论】:
-
我不认为你可以在 Android Q 中拥有 root 访问权限
-
我测试过的一些应用程序通过范围存储具有此访问权限。例如“Solid explorer”应用。
-
是的,我知道。我曾问过类似的问题,CommonWare 对我说这是因为那些公司拥有的工程师。我知道,他的回答没那么有用。
-
root 访问是什么意思?
-
访问设备存储文件。显示默认文件资源管理器预装应用程序的相同文件。我不是在谈论系统根文件。已安装设备、外部 sd 卡和内部存储的根目录。
标签: android android-10.0 scoped-storage