【发布时间】:2020-07-14 20:27:26
【问题描述】:
我能够将文件从 Firebase 存储下载到 storage/emulated/0/Pictures,这是大多数流行应用程序以及 Facebook 或 Instagram 等正在使用的图片的默认文件夹。现在 Android Q 在存储和访问文件方面有很多行为变化,我的应用在 Android Q 中运行时不再能够从存储桶中下载文件。
这是将文件从 Firebase 存储桶写入和下载到大容量存储默认文件夹(如图片、电影、文档等)的代码。它适用于 Android M,但不适用于 Q。
String state = Environment.getExternalStorageState();
String type = "";
if (downloadUri.contains("jpg") || downloadUri.contains("jpeg")
|| downloadUri.contains("png") || downloadUri.contains("webp")
|| downloadUri.contains("tiff") || downloadUri.contains("tif")) {
type = ".jpg";
folderName = "Images";
}
if (downloadUri.contains(".gif")){
type = ".gif";
folderName = "Images";
}
if (downloadUri.contains(".mp4") || downloadUri.contains(".avi")){
type = ".mp4";
folderName = "Videos";
}
//Create a path from root folder of primary storage
File dir = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + "/" + Environment.DIRECTORY_PICTURES + "/MY_APP_NAME");
if (Environment.MEDIA_MOUNTED.equals(state)){
try {
if (dir.mkdirs())
Log.d(TAG, "New folder is created.");
}
catch (Exception e) {
e.printStackTrace();
Crashlytics.logException(e);
}
}
//Create a new file
File filePath = new File(dir, UUID.randomUUID().toString() + type);
//Creating a reference to the link
StorageReference httpsReference = FirebaseStorage.getInstance().getReferenceFromUrl(download_link_of_file_from_Firebase_Storage_bucket);
//Getting the file from the server
httpsReference.getFile(filePath).addOnProgressListener(taskSnapshot ->
showProgressNotification(taskSnapshot.getBytesTransferred(), taskSnapshot.getTotalByteCount(), requestCode)
);
这样,它会将文件从服务器下载到您的设备存储中,路径为 storage/emulated/0/Pictures/MY_APP_NAME,但对于 Android Q,这将不再有效,因为许多 API 已被弃用,如 Environment.getExternalStorageDirectory()。
使用android:requestLegacyExternalStorage=true 是一种临时解决方案,但很快将不再适用于 Android 11 及更高版本。
所以我的问题是如何使用 Firebase Storage API 在根目录中的默认 Picture 或 Movie 文件夹而不是 Android/data/com.myapp.package/files 上下载文件。
MediaStore 和 ContentResolver 有解决方案吗?我需要应用哪些更改?
【问题讨论】:
-
您可以下载为 Uri。将uri转换为位图后。然后使用 MediaStore 和 ContentResolver 将文件保存到“storage/emulated/0/Pictures/MY_APP_NAME”。
-
或者,如果您知道文件 url,您可以使用 Glide 将文件下载为位图。然后将您的文件保存到“storage/emulated/0/Pictures/MY_APP_NAME。您可以将文件下载到外部存储,没问题。
-
Does MediaStore and ContentResolver has solution for this?。是的。过去几周,代码已多次发布。如果只有你会阅读标记为“媒体商店”的页面。 -
你想在这里“storage/emulated/0/Pictures”下载,对吧?
-
@KasımÖzdemir 是的,但如果它是视频或 pdf 而不仅仅是图像怎么办?你能告诉我如何处理返回的 Uri 吗?
标签: android firebase firebase-storage android-contentresolver mediastore