【发布时间】: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