开发者社区> 问答> 正文

Android从URI创建可写DocumentFile

我正在尝试使js File-based 文
档系统适应某种js DocumentFile 用
途,以便允许外部存储对API> = 29的读/写访问。

我让用户使用来选择SD卡根目录js Intent.ACTION_OPEN_DOCUMENT_TREE ,
然后js Uri 按
预期方式返回a ,然后可以使用来处理:

```js

getContentResolver().takePersistableUriPermission(resultData.getData(), Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);

我可以成功浏览外部存储内容直至所选根目录。都好。

但是我需要做的是在选择的(子)文件夹中写入一个任意文件,这就是我遇到问题的地方。

 ```js
DocumentFile file = DocumentFile.fromSingleUri(mContext, Uri.parse(toPath));
    Uri uri = file.getUri();
    FileOutputStream output = mContext.getContentResolver().openOutputStream(uri);

除了js 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);

我得到了```js java.io.IOException:


   ```js
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)

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

对于它的价值,js Uri 我
从下面js Intent.ACTION_OPEN_DOCUMENT_TREE 看
起来像这样:

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

有趣的是,当我使用Uri来创建DocumentFile要浏览的对象时,使用documentFile = js DocumentFile.fromTreeUri(context, uri) ,
js documentFile.getURI().toString() 如
下所示:

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

即,它的末尾附加了一些内容。

然后,我进入应为可写文件夹的位置(如“下载”),并尝试如上所述创建可写文件。“下载”文件夹获取js Uri :

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

然后js Uri 我
js toPath 上
面用于的是:

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

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

在Storage Access Framework限制下,我实际上尚未找到有关写入任意文件的任何体面信息。

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

展开
收起
几许相思几点泪 2019-12-05 15:14:50 2809 0
0 条回答
写回答
取消 提交回答
问答分类:
问答标签:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
58同城Android客户端Walle框架演进与实践之路 立即下载
Android组件化实现 立即下载
蚂蚁聚宝Android秒级编译——Freeline 立即下载