Скачать массив аудио из Firebase Storage - PullRequest
0 голосов
/ 24 января 2019

Мое приложение должно загружать каждый звук, который будет загружен в 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 []).

Спасибо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...