Я пытаюсь получить URL аудиофайла в облачном хранилище. Я могу отправлять сообщения в хранилище, но эта функция возвращает только null. При отладке он перескакивает через 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;
}
Файлы находятся в папке верхнего уровня с названием music.




I can post to the storage just fine, but this function only returns null.
Вы не можете сейчас вернуть что-то, что еще не загружено. Другими словами, вы не можете просто создать переменную fileUrl как глобальную переменную и использовать ее вне метода onSuccess(), потому что она всегда будет null из-за асинхронного поведения этого метода. Это означает, что к тому времени, когда вы пытаетесь использовать этот результат вне этого метода, данные еще не закончили загрузку из базы данных и поэтому недоступны.
Быстрое решение этой проблемы состояло бы в том, чтобы использовать значение fileUrl, поступающее из базы данных, только внутри метода onSuccess(), в противном случае я рекомендую вам посмотреть последнюю часть моего ответа из этого сообщение, в котором я объяснил, как это можно сделать. с помощью пользовательского обратного вызова. Вы также можете взглянуть на этот видео для лучшего понимания.
Также убедитесь, что на устройстве пользователя есть стабильное интернет-соединение.
Где вы используете функцию getFileUrl?