Firebase存储下载文件到Android上的URI

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

在库中或从相机中选择图像后,我使用Firebase存储器来存储图像。我有一个函数createUriForFile(),我用它来获得一个URI将图像存储在本地。选择图像后,将其存储在正确的位置,并使用滑行和与以前相同的createUriForFile(),将其显示并正确上传到Firebase。但是,当我使用其他仿真器而不是拍摄图像的仿真器并尝试下载该图像时,它会抛出Java.io.IOException: no such file or directory。我不明白为什么,因为除了下载它以将其保存在设备上之外,所有内容都与特定的URI兼容。

我知道Firebase的设置和代码是正确的,因为当我使用File作为目标而不是URI时,会下载并显示图像(API <= 28)。但是由于Android 29,我们不能再使用直接文件访问(我想将图像存储在共享文件夹中以在图库中显示)。我知道您可以使用inputStreamoutputStream,但这似乎很奏效,因为getFile()接受URI作为参数。因此,我认为这一定是我做错了。它在API 29或<= 28上均不起作用。目录在应用尝试下载文件时创建,并且在保存和上传时均有效,因此URI似乎还可以。

我已将fileprovider添加到清单文件,并将路径添加到xml文件。

createUriForFile:

EXTERNAL_PICTURE_RELATIVE_PATH = Environment.DIRECTORY_PICTURES + File.separator + baseActivity.getString(R.string.app_name);
EXTERNAL_PICTURE_STORAGE_DIR = baseActivity.getExternalFilesDir(Environment.DIRECTORY_DOCUMENTS).getAbsolutePath() + File.separator + EXTERNAL_PICTURE_RELATIVE_PATH;

public Uri createUriForFile(String fileName, String parentId)
    if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q)
    {
        //check if there is already an entry in ContentResolver
        Uri uriFromContentResolver = getUriFromContentResolver(fileName);
        if(uriFromContentResolver != null)
        {
            return uriFromContentResolver;
        }else
        {
            ContentResolver resolver = baseActivity.getApplicationContext().getContentResolver();
            ContentValues contentValues = new ContentValues();
            contentValues.put(MediaStore.Images.Media.DISPLAY_NAME, fileName);
            contentValues.put(MediaStore.Images.Media.MIME_TYPE, "image/jpg");
            contentValues.put(MediaStore.Images.Media.RELATIVE_PATH, EXTERNAL_PICTURE_RELATIVE_PATH);
            return resolver.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, contentValues);
        }
    }else
    {
        checkAndCreatePictureDir(parentId);
        File pictureFile = new File(EXTERNAL_PICTURE_STORAGE_DIR + File.separator + parentId + File.separator + fileName);

        return FileProvider.getUriForFile(baseActivity.getBaseContext(), baseActivity.getApplicationContext().getPackageName() + ".fileprovider", pictureFile);
    }
}

错误的堆栈跟踪:

E/StorageException: StorageException has occurred.
An unknown error occurred, please check the HTTP result code and inner exception for server response.
 Code: -13000 HttpResult: 200
No such file or directory
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:1008)
    at com.google.firebase.storage.FileDownloadTask.processResponse(com.google.firebase:firebase-storage)
    at com.google.firebase.storage.FileDownloadTask.run(com.google.firebase:firebase-storage)
    at com.google.firebase.storage.StorageTask.lambda$getRunnable$7(com.google.firebase:firebase-storage@@19.1.0:1072)
    at com.google.firebase.storage.StorageTask$$Lambda$12.run(Unknown Source:2)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
    at java.lang.Thread.run(Thread.java:764)

非常感谢任何帮助或提示。

android uri firebase-storage ioexception
2个回答
0
投票
<provider android:name="androidx.core.content.FileProvider" android:authorities="${applicationId}.provider" android:exported="false" android:grantUriPermissions="true"> <meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/file_paths"/> </provider> <?xml version="1.0" encoding="utf-8"?> <paths> <files-path name="external_files" path="." /> </paths>

0
投票
getFile(Uri destinationUri) Asynchronously downloads the object at this StorageReference to a specified system filepath.

尽管我最初几次都没有看到它,并且说它可以接受URI,但显然它仍然需要系统上文件的真实路径。因此,我决定继续使用inputStreamoutputStream通过ContentResolver

写入数据
© www.soinside.com 2019 - 2024. All rights reserved.