Мне удалось загрузить файл из Firebase Storage в storage/emulated/0/Pictures
, который является папкой по умолчанию для изображений, которые также используются в самых популярных приложениях, таких как Facebook или Instagram. Теперь, когда Android Q имеет множество поведенческих изменений при хранении и доступе к файлу, мое приложение больше не может загружать файл из корзины при работе в Android Q.
Это код, который записывает и загружает файл из корзины Firebase Storage в папки по умолчанию для массового хранилища, такие как «Изображения», «Фильмы», «Документы» и т. Д. Он работает на 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 и более поздних версиях.
Итак, мой вопрос: как я могу загружать файлы с помощью API хранилища Firebase в папке Picture или Movie по умолчанию, которая находится в корне, а не в Android/data/com.myapp.package/files
.
Есть ли у MediaStore
и ContentResolver
решение для этого? Какие изменения мне нужно применить?
Does MediaStore and ContentResolver has solution for this?
. да. И код публиковался много раз за последние недели. Если бы вы только читали страницы с тегами `mediastore '. - person blackapps   schedule 02.04.2020