gpt4 book ai didi

android - 从 URI 创建可写的 DocumentFile

转载 作者:行者123 更新时间:2023-11-30 04:55:51 26 4
gpt4 key购买 nike

我正在尝试使基于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:无法打开写入:java.io.FileNotFoundException:打开失败:EISDIR(是目录)

这让我有点困惑,但“找不到文件”部分表明我可能需要先创建空白输出文件,所以我尝试这样做,例如:

    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)

这对我来说没有意义,因为树应该是可写的。

就其值(value)而言,我从 Intent.ACTION_OPEN_DOCUMENT_TREE 返回的 Uri 如下所示:

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

然后我在上面用于 toPathUri 是:

content://com.android.externalstorage.documents/tree/0B07-1910%3A/document/0B07-1910%3ADownload/Testing.tmp

这会导致前面描述的尝试创建它的问题。

我实际上还没有找到任何关于在存储访问框架限制下写入任意文件的可靠信息。

我做错了什么?谢谢。 :)

最佳答案

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()。

关于android - 从 URI 创建可写的 DocumentFile,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59189631/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com