Мое приложение должно загружать каждый звук, который будет загружен в Firebase Storage.Для этого я пошел следующим образом:
1) все звуки в Firebase Storage должны быть названы от 1 до n (1.mp3, 2.mp3, 3.mp3 ... n.mp3). введите описание изображения здесь
2) После этого он создает ArrayList временных файлов.Звуки из Firebase Storage будут загружены прямо в них.
private int howmuch = 4;
ArrayList<File> music = new ArrayList<File>();
ArrayList<StorageReference> url = new ArrayList<StorageReference>();
try {
for(int i=1; i <= howmuch; i++){
music.add(File.createTempFile("qqqq"+i, "mp3"));}
} catch (IOException e) {
e.printStackTrace();
}
for(int j=1; j <= howmuch; j++){
url.add(FirebaseStorage.getInstance().getReferenceFromUrl("gs://engapp-c0f2e.appspot.com/beginner/"+j+".mp3"));
}
for (int i = 0; i < howmuch; i++){
url.get(i).getFile(music.get(i)).addOnSuccessListener(new OnSuccessListener<FileDownloadTask.TaskSnapshot>() {
@Override
public void onSuccess(FileDownloadTask.TaskSnapshot taskSnapshot) {
// Successfully downloaded data to local file
// ...
Log.d(TAG, "Successfully");
}
}).addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception exception) {
// Handle failed download
// ...
Log.w(TAG, "Failure");
}
});
Переменная howmuch возвращает положительное целое число, это количество звуков, которые необходимо точно загрузить, и количество временных файлов, которые необходимо создать.Ясно, что их числа должны быть равны.Это может быть как 4, так и 10, как 100.
ArrayList music содержит временные файлы, куда он помещает наши звуки.IDE заставил меня обернуть его, чтобы попытаться / поймать.
ArrayList url содержит ССЫЛКИ на каждый файл, который требуется загрузить.Как видите, для этого я использую цикл для (это может показаться странным, но я не знаю лучшего решения).
Так что он работает хорошо, несмотря на то, что алгоритм кажется слабым.Он загружает все звуки, и я могу играть дальше с MediaPlayer.Вот как я это делаю:
try {
mp.setDataSource(File.separator + DBcontent.getMusic(counter));
mp.prepare();
mp.start();
counter ++;
} catch (IOException e) {
e.printStackTrace();
}
DBcontent - это объект класса, в который мы поместили наши звуки во временные файлы из Firebase Storage.Метод getMusic () - это типичный геттер
counter - типичный счетчик.С начала counter = 0.Поэтому мы будем извлекать КАЖДЫЙ звук из нашего ArrayList и заставлять его воспроизводить.
public File getMusic(int a){
File c = music.get(a);
return c;
}
Теперь главная проблема.Если Firebase Storage содержит меньше звуков, чем нам нужно загрузить (например, howmuch = 10, но в нашем хранилище всего 5 звуков), это все равно будет работать, но временные файлы будут пустыми, поэтому он не сможетбыть сыграннымэто означает, что если howmuch равно 10, а counter равно 6, то приложение будет работать некорректно.
Что именно мне нужно.Либо алгоритм проверки ArrayList временных файлов на наличие EMPTY / null и последующего удаления их, либо любое другое решение для загрузки звуков и помещения их в ArrayList (или даже sipmlest Array []).
Спасибо.