通过 android studio 应用程序共享图像以及存储在 firebaseStorage 中的图像

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

存储在 FirbaseStorage 中的图像及其存储在 FirebaseDatarealtime 中的链接如下所示:

(https://i.stack.imgur.com/AsCrC.png)

然后使用 Glide 向用户展示图像,当用户单击图像时,会创建一个用于共享图像的新意图,代码如下:

imageUrl = 存储在 Firebase Datarealtime 中的图像 url

StorageReference storageRef = FirebaseStorage.getInstance().getReferenceFromUrl(imageUrl);
storageRef.getDownloadUrl().addOnSuccessListener(new OnSuccessListener<Uri>() {
    @Override
    public void onSuccess(Uri uri) {
        String downloadUrl = uri.toString();
        shareImage(downloadUrl);
    }
})
.addOnFailureListener(new OnFailureListener() {
    @Override
    public void onFailure(@NonNull Exception exception) {
        // Handle any errors
    }
});
private void shareImage(String downloadUrl) {
    Intent shareIntent = new Intent(Intent.ACTION_SEND);
    shareIntent.setType("image/png");
    shareIntent.putExtra(Intent.EXTRA_STREAM, Uri.parse(downloadUrl));
    shareIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
    startActivity(Intent.createChooser(shareIntent, "Share Image"));
}

结果:“不支持该文件格式”

我希望能够通过从 Firebase Datarealtime 抓取其链接来共享存储在 FirebaseStorage 中的这些图像,并在 Whatsapp、Facebook 应用程序等社交应用程序中共享它们。

java android firebase-realtime-database firebase-storage
1个回答
0
投票

看来你已经快到了!当您尝试共享的 URI 的格式不适合共享意图时,通常会出现“不支持文件格式”错误。您应该为文件创建一个

Uri.parse(downloadUrl)
URI 并在共享意图中使用它,而不是使用
FileProvider
。您可以通过以下方式修改代码来实现此目的:

首先,确保您的

FileProvider
中配置了
AndroidManifest.xml

 <provider
        android:name="androidx.core.content.FileProvider"
        android:authorities="${applicationId}.fileprovider"
        android:exported="false"
        android:grantUriPermissions="true">
        <meta-data
            android:name="android.support.FILE_PROVIDER_PATHS"
            android:resource="@xml/file_paths" />
    </provider>

然后,在您的

file_paths.xml
目录中创建一个
res/xml
文件,其中包含以下内容:

<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
    <cache-path name="shared_images" path="/" />
</paths>

接下来,修改您的代码以使用

FileProvider.getUriForFile()

private void shareImage(String downloadUrl) {
    FirebaseStorage storage = FirebaseStorage.getInstance();
    StorageReference storageRef = storage.getReferenceFromUrl(downloadUrl);

    try {
        final File localFile = File.createTempFile("images", "jpg");
        storageRef.getFile(localFile).addOnSuccessListener(taskSnapshot -> {
            Uri fileUri = FileProvider.getUriForFile(MainActivity.this,
                    BuildConfig.APPLICATION_ID + ".fileprovider", localFile);

            Intent shareIntent = new Intent(Intent.ACTION_SEND);
            shareIntent.setType("image/*");
            shareIntent.putExtra(Intent.EXTRA_STREAM, fileUri);
            shareIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
            startActivity(Intent.createChooser(shareIntent, "Share Image"));
        }).addOnFailureListener(exception -> {
            // Handle any errors
            Log.e("TAG", "Failed to download file: " + exception.getMessage());
        });
    } catch (IOException e) {
        e.printStackTrace();
    }
}

此代码会将图像文件下载到临时位置并创建一个用于共享的

FileProvider
URI。请注意,此方法将在您每次共享图像时下载该图像。如果您想避免不必要的下载,可以在第一次下载后实现缓存逻辑将图像存储在本地。

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