Вы можете загружать файлы по одному и добавлять Uri
s в список.Поскольку выгрузка является асинхронной задачей, вам нужно обернуть весь блок в новый поток и дождаться, пока каждый из них завершит его выполнение, один за другим.
Когда я искал, существуют существующие сообщения, спрашивающие, какждать нескольких обратных вызовов.Я разместил ответ в одном из них. Здесь - ссылка на ответ.Читайте дальше после проверки.
Вот как это выглядит после реализации того, что там описано.(Я не запускал код. Могут быть незначительные ошибки.)
new Thread(new Runnable() {
@Override
public void run() {
final List < String > urls = new ArrayList();
for (int i = 0; i < photos.size(); i++) {
mStorage = FirebaseStorage.getInstance().getReference().child("images/" + j);
mUploadTask = mStorage.putFile(photos.get(i));
final ThreadLockedTask < String > t = new ThreadLockedTask < > ();
final String url = t.execute(new Runnable() {
@Override
public void run() {
Task < Uri > urlTask = uploadTask.continueWithTask(new Continuation < UploadTask.TaskSnapshot, Task < Uri >> () {
@Override
public Task < Uri > then(@NonNull Task < UploadTask.TaskSnapshot > task) throws Exception {
if (!task.isSuccessful()) {
t.setResult(null);
throw task.getException();
}
return mStorage.getDownloadUrl();
}
}).addOnCompleteListener(new OnCompleteListener < Uri > () {
@Override
public void onComplete(@NonNull Task < Uri > task) {
if (task.isSuccessful()) {
String url = task.getResult().toString();
t.setResult(url);
}
}
});
}
});
if(url!=null)
urls.add(url);
}
//Now you have all the urls in the list "urls"
}
}).start();