FireBase getDownloadUrl не выполняется onSuccess или onFailure - PullRequest
1 голос
/ 02 апреля 2019

Я пытаюсь получить URL аудиофайла в облачном хранилище. Я могу опубликовать в хранилище просто отлично, но эта функция возвращает только ноль. При отладке он прыгает как onSuccess, так и onFailure.

Я знаю, что переменная имени файла правильная, но я пытался ее жестко запрограммировать, но безуспешно. Я передаю mStorageRef в качестве StorageReference. fileUrl в настоящее время является глобальной строкой.

mStorageRef = FirebaseStorage.getInstance().getReference();

String getFileUrl(String filename, StorageReference storageRef) {

        storageRef.child("music").child(filename).getDownloadUrl().addOnSuccessListener(new OnSuccessListener<Uri>() {
            @Override
            public void onSuccess(Uri uri) {
                fileUrl = uri.toString();
            }
        }).addOnFailureListener(new OnFailureListener() {
            @Override
            public void onFailure(@NonNull Exception e) {
                fileUrl = e.getMessage();
            }
        });

        return fileUrl;
    }

Файлы находятся в папке верхнего уровня, называемой музыкой.

firebase storage structure

1 Ответ

1 голос
/ 02 апреля 2019

Я могу нормально публиковать в хранилище, но эта функция возвращает только ноль.

Вы не можете вернуть что-то, что еще не было загружено.Другими словами, вы не можете просто создать переменную fileUrl как глобальную переменную и использовать ее вне метода onSuccess(), поскольку она всегда будет null из-за асинхронного поведения этого метода.Это означает, что к тому времени, когда вы пытаетесь использовать этот результат вне этого метода, данные еще не закончили загрузку из базы данных, и поэтому они недоступны.

Быстрое решение этой проблемы -используйте значение fileUrl, которое поступает из базы данных только внутри метода onSuccess(), в противном случае я рекомендую вам увидеть последнюю часть моего ответа из этого поста , в котором яобъяснили, как это можно сделать с помощью пользовательского обратного вызова.Вы также можете взглянуть на это видео для лучшего понимания.

Также убедитесь, что на устройстве пользователя установлено стабильное подключение к Интернету.

...