Firebase存储使用“content://”下载getFile(Uri)uri抛出java.io.IOException:没有这样的文件或目录

时间:2018-03-21 02:43:28

标签: android firebase firebase-storage

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

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

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

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

3)Local为文件创建文件和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我做错了什么? THX。

其他信息:

Uri指向驻留在app-internal目录中的文件,因此不需要存储读/写权限。

我使用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);

1 个答案:

答案 0 :(得分:0)

Firebase的getFile还将suuports File作为参数,因此您可能想尝试一下