【问题标题】:Firebase Storage Download getFile(Uri) with "content://" uri throws java.io.IOException: No such file or directoryFirebase Storage Download getFile(Uri) with "content://" uri throws java.io.IOException: No such file or directory
【发布时间】:2018-08-30 00:54:40
【问题描述】:

我的用例:仅当本地 uri 无法解析内容时才从远程获取内容。

1) 文件在 Firebase 存储中远程可用,具有以下参考结构 user.uid/files/fileId,例如:

ysCwjgc0zGfUNuZimHGaun0MzlP2/files/document-d876e8aa-4b6a-45ed-b2f1-dfd2fbf21360

2) 本地设备确定内容不可用,尝试使用与上述相同的引用从 Firebase 存储获取。

3) 本地创建文件并为该文件创建 getUri,如下所示:

// TEST
File f = new File(context.getFilesDir() + "/pictures",fileId + ".jpg");
Log.e(LOG_TAG,"test local file created: " + f.getAbsolutePath());
Uri localUri = FileProvider.getUriForFile(context,FILE_PROVIDER_AUTHORITY,f);
Log.e(LOG_TAG, "test local file content uri created: " + localUri.toString());

4) 尝试使用 localUri 作为 getFile(android.net.Uri) 的参数以从 Firebase 获取文件: 但是我的猫会尖叫以下 IO 异常。

E/FileRemoteDataSource: Local file not found, trying to fetch from remote...
E/FileRemoteDataSource: test local file created: /data/user/0/com.sample.app/files/pictures/document-d876e8aa-4b6a-45ed-b2f1-dfd2fbf21360.jpg
E/FileRemoteDataSource: test local file uri created: content://com.sample.app.fileprovider/pics/document-d876e8aa-4b6a-45ed-b2f1-dfd2fbf21360.jpg
E/FileDownloadTask: Exception occurred during file write.  Aborting.
java.io.IOException: No such file or directory
at java.io.UnixFileSystem.createFileExclusively0(Native Method)
at java.io.UnixFileSystem.createFileExclusively(UnixFileSystem.java:281)
at java.io.File.createNewFile(File.java:1000)
at com.google.firebase.storage.FileDownloadTask.zza(Unknown Source:75)
at com.google.firebase.storage.FileDownloadTask.run(Unknown Source:190)

5) 尝试使用 f 作为 getFile(File) 的参数以从 Firebase 获取文件: 我可以很好地获取文件,我的猫完全睡着了……

E/FileRemoteDataSource: Local file not found, trying to fetch from remote...
E/FileRemoteDataSource: test local file created: /data/user/0/com.sample.app/files/pictures/document-d876e8aa-4b6a-45ed-b2f1-dfd2fbf21360.jpg
E/FileRemoteDataSource: test local file uri created: content://com.sample.app.fileprovider/pics/document-d876e8aa-4b6a-45ed-b2f1-dfd2fbf21360.jpg
// No exception, got file

注意:在我的项目中,我在其他地方有提供逻辑的文件,上面只是一个示例。我希望尽可能多地使用内容 uri,使用内容 uri 做错了什么?谢谢。

其他信息:

Uri 指向驻留在应用程序内部目录中的文件,因此存储读/写权限是并且不应该是必需的。

我使用 Firebase 通过它的 Uri 上传文件,它能够完美地定位、读取和上传文件。与android框架FileProvider.getUriForFile(f)提供的相同的本地uri。测试文件上传成功如下:

// putFile(uri) where uri references to a local file where to
// upload the file from.
UploadTask uploadTask = resourceRef.putFile(localUri);

【问题讨论】:

    标签: android firebase firebase-storage


    【解决方案1】:

    Firebase 的 getFile 也支持 File 作为参数,因此您可能想尝试一下

    【讨论】:

      猜你喜欢
      • 2021-05-18
      • 2023-04-03
      • 2018-11-22
      • 2016-09-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-05
      • 2016-11-01
      相关资源
      最近更新 更多