Android 在共享存储中使用操作创建文档创建的目录可以';除非再次通过“操作\打开\文档\树”请求用户同意,否则不能使用
我正在尝试升级一个应用程序,使其与Android11共享存储概念保持一致。此应用程序需要将其创建的gpx文件存储在未销毁的存储区域中,以防卸载该应用程序。该区域应保留在共享存储中,并且可以使用操作\u创建\u文件创建目录: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
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树可以创建一个目录,并允许用户获得对该用户的访问权限。谢谢