Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/190.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 在共享存储中使用操作创建文档创建的目录可以';除非再次通过“操作\打开\文档\树”请求用户同意,否则不能使用_Android_Storage Access Framework - Fatal编程技术网

Android 在共享存储中使用操作创建文档创建的目录可以';除非再次通过“操作\打开\文档\树”请求用户同意,否则不能使用

Android 在共享存储中使用操作创建文档创建的目录可以';除非再次通过“操作\打开\文档\树”请求用户同意,否则不能使用,android,storage-access-framework,Android,Storage Access Framework,我正在尝试升级一个应用程序,使其与Android11共享存储概念保持一致。此应用程序需要将其创建的gpx文件存储在未销毁的存储区域中,以防卸载该应用程序。该区域应保留在共享存储中,并且可以使用操作\u创建\u文件创建目录: Intent intent = new Intent(ACTION_CREATE_DOCUMENT); intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); intent.addFlags(Intent.FLAG_GR

我正在尝试升级一个应用程序,使其与Android11共享存储概念保持一致。此应用程序需要将其创建的gpx文件存储在未销毁的存储区域中,以防卸载该应用程序。该区域应保留在共享存储中,并且可以使用操作\u创建\u文件创建目录:

Intent intent = new Intent(ACTION_CREATE_DOCUMENT);
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
intent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
intent.addFlags(FLAG_GRANT_PERSISTABLE_URI_PERMISSION);
intent.setType(DocumentsContract.Document.MIME_TYPE_DIR);
intent.putExtra(Intent.EXTRA_TITLE, "AGPS-Tracker");
startActivityForResult(intent, SS_CREATE_GPX_DIR_REQUEST); 
在onActivityResult中:

Uri uri = data.getData();
 final   int takeFlags = data.getFlags()
     & (Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
 getContentResolver().takePersistableUriPermission(uri, takeFlags);
 startDirUri = DocumentsContract.buildTreeDocumentUri(uri.getAuthority(),DocumentsContract.getDocumentId(us));
然后我尝试使用startDirUri:

    uriDir = DocumentsContract.buildDocumentUriUsingTree(startDirUri, DocumentsContract.getTreeDocumentId(startDirUri));
我得到:java.lang.SecurityException:权限拒绝:读取com.android.externalstorage.ExternalStorageProvider uricontent://com.android.externalstorage.documents/tree/primary%3AAGPS-跟踪器%20(11)/文档/主%3AGPS跟踪器%20(11)/来自pid的子级=7209,uid=10341要求您使用ACTION\u OPEN\u文档或相关API获得访问权限

然后,如果我在这个新创建的目录上使用ACTION\u OPEN\u DOCUMENT\u树,最终我获得了访问权限


我的问题是:为什么用户创建的目录不能立即使用?确实,我们需要向用户询问两次:首先创建,然后使用同一个目录?

intent.setType(DocumentsContract.Document.MIME\u TYPE\u DIR)不要这样做。它不适用于目录。它用于文件类型。它“起作用”是一个错误。您所做的事情以前已经报告过。
intent.addFlags(intent.FLAG\u GRANT\u READ\u URI\u PERMISSION);addFlags(intent.FLAG\u GRANT\u WRITE\u URI\u权限);addFlags(FLAG\u GRANT\u PERSISTABLE\u URI\u PERMISSION)所有这些标志都没有意义。从未。这种滥用以前也曾发生过。如果创建一个带有操作\u CREATE\u DOCUMENT和intent.setType(documents contract.DOCUMENT.MIME\u TYPE\u DIR)的目录是一个错误,那么我们应该如何在共享存储中为非介质的文件创建目录?您可以使用操作\u OPEN\u DOCUMENT\u TREE。在该操作期间,用户可以创建目录并选择它们。如果只选择一个目录,则在onActivityResult之后,可以在choosen目录中创建子目录。我现在才明白,ACTION\u OPEN\u DOCUMENT\u树可以创建一个目录,并允许用户获得对该用户的访问权限。谢谢