存储在 FirbaseStorage 中的图像及其存储在 FirebaseDatarealtime 中的链接如下所示:
然后使用 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 应用程序等社交应用程序中共享它们。
看来你已经快到了!当您尝试共享的 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。请注意,此方法将在您每次共享图像时下载该图像。如果您想避免不必要的下载,可以在第一次下载后实现缓存逻辑将图像存储在本地。