我正在尝试使用File
使基于DocumentFile
的文档系统适应某种事物,以便允许外部存储对API> = 29的读/写访问。
我让用户使用Intent.ACTION_OPEN_DOCUMENT_TREE
选择SD卡根目录,然后按预期方式返回了Uri
,然后可以使用以下命令进行处理:
getContentResolver().takePersistableUriPermission(resultData.getData(),
Intent.FLAG_GRANT_READ_URI_PERMISSION
| Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
我可以成功浏览外部存储内容直至所选根目录。一切都很好。
但是我需要做的是在选定的(子)文件夹中写入一个任意文件,这就是我遇到问题的地方。
DocumentFile file = DocumentFile.fromSingleUri(mContext, Uri.parse(toPath));
Uri uri = file.getUri();
FileOutputStream output = mContext.getContentResolver().openOutputStream(uri);
除openOutputStream()
通话外,我得到:
java.io.FileNotFoundException: Failed to open for writing: java.io.FileNotFoundException: open failed: EISDIR (Is a directory)
这让我有些困惑,但是“找不到文件”部分建议我可能需要先创建空白的输出文件,所以我尝试这样做,例如:
DocumentFile file = DocumentFile.fromSingleUri(mContext, Uri.parse(toPath));
Uri uri = file.getUri();
if (file == null) {
return false;
}
if (file.exists()) {
file.delete();
}
DocumentFile.fromTreeUri(mContext, Uri.parse(getParentPath(toPath))).createFile("", uri.getLastPathSegment());
FileOutputStream output = mContext.getContentResolver().openOutputStream(uri);
我得到一个java.io.IOException
:
java.lang.IllegalStateException: Failed to touch /mnt/media_rw/0B07-1910/Testing.tmp: java.io.IOException: Read-only file system
at android.os.Parcel.createException(Parcel.java:2079)
at android.os.Parcel.readException(Parcel.java:2039)
at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:188)
at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:140)
at android.content.ContentProviderProxy.call(ContentProviderNative.java:658)
at android.content.ContentResolver.call(ContentResolver.java:2042)
at android.provider.DocumentsContract.createDocument(DocumentsContract.java:1327)
at androidx.documentfile.provider.TreeDocumentFile.createFile(TreeDocumentFile.java:53)
at androidx.documentfile.provider.TreeDocumentFile.createFile(TreeDocumentFile.java:45)
这对我没有意义,因为树应该是可写的。
对于价值而言,我从Uri
回来的Intent.ACTION_OPEN_DOCUMENT_TREE
看起来像这样:
content://com.android.externalstorage.documents/tree/0B07-1910%3A
有趣的是,当我使用Uri
使用那个DocumentFile
创建一个documentFile = DocumentFile.fromTreeUri(context, uri)
对象进行浏览时,documentFile.getURI().toString()
看起来像:
content://com.android.externalstorage.documents/tree/0B07-1910%3A/document/0B07-1910%3A
即,它的末尾附加了一些内容。
然后,我进入应该是可写的文件夹(如“下载”),然后尝试如上所述创建可写文件。 “下载”文件夹获取Uri
:
content://com.android.externalstorage.documents/tree/0B07-1910%3A/document/0B07-1910%3ADownload
,而我上面用于Uri
的{{1}}就是:
toPath
这会导致前面所述的尝试创建它的问题。
在Storage Access Framework限制下,我实际上没有发现有关写入任意文件的任何体面信息。
我在做什么错?谢谢。 :)
答案 0 :(得分:0)
Uri uri = uri obtained from ACTION_OPEN_DOCUMENT_TREE
String folderName = "questions.59189631";
DocumentFile documentDir = DocumentFile.fromTreeUri(context, uri);
DocumentFile folder = documentDir.createDirectory(folderName);
return folder.getUri();
将createFile()用于可写文件。