【发布时间】:2019-05-15 14:38:11
【问题描述】:
我已成功将多个选定的音频文件上传到 Firebase 存储,并且我能够检索所有这些文件的 URL。由于我必须上传多个文件,因此我使用 for 循环来执行此操作。上传文件并检索 URL 后,我想将它们保存到 firestore,这就是我为此所做的。
上传文件功能
private void uploadAudioFiles(List<Uri> list, final Map<String, String> hashMap) {
if (list.size() > 0){
for (int a=0; a<list.size(); a++){
Uri perFile = list.get(a);
String filename = getSelectedFileName(perFile);
final StorageReference audioFileReference = referenceFolder.child("audioClipData/"+filename);
final int finalA = a;
audioFileReference.putFile(perFile).addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
@Override
public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
audioFileReference.getDownloadUrl().addOnSuccessListener(new OnSuccessListener<Uri>() {
@Override
public void onSuccess(Uri uri) {
hashMap.put("audioFile"+ finalA, String.valueOf(uri));
Log.e("APP_LOG:HashMap(AudioA)", String.valueOf(hashMap));
}
});
}
});
}
}
}
点击保存按钮
下面是调用uploadAudioFiles()函数的代码。
Map<String, String> hashMap = new HashMap<>();
String username = name.getText().toString();
if (!username.isEmpty()){
progressDialog.show();
hashMap.put("username", username);
uploadAudioFiles(audioClipList, hashMap);
Log.e("APP_LOG:HashMapFINAL", hashMap.toString());
firestore.collection(currentUser.getUid()).add(hashMap).addOnSuccessListener(new OnSuccessListener<DocumentReference>() {
@Override
public void onSuccess(DocumentReference documentReference) {
progressDialog.dismiss();
}
});
}else {
name.setError("Required");
}
这是我在 uploadAudioFiles() 函数中得到的日志
E/APP_LOG:HashMap(AudioA): {username=Abhi, audioFile0=https://firebasestorage.googleapis.com/v0/b/myapp.appspot.com/o/linktofile}
这是我在 uploadAudioFiles() (ButtonClick) 函数之外得到的日志
E/APP_LOG:HashMapFINAL: {username=Abhi}
现在我不明白为什么当我在uploadfile 函数中和在uploadfile 函数之外时HashMap 是不同的。这是因为 for 循环的范围还是其他原因?
有人可以帮我了解情况和解决方法吗?
【问题讨论】:
标签: android firebase hashmap google-cloud-firestore firebase-storage