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

问题描述 投票:0回答:1

我的用例:仅当本地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我做错了什么?谢谢。

附加信息:

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);
android firebase firebase-storage
1个回答
0
投票

Firebase getFile还支持File作为参数,因此您可能希望尝试使用它

© www.soinside.com 2019 - 2024. All rights reserved.