我正在从 Firebase 存储上的数组上传两个文件,并希望获取这两个文件的 getDownloadUrl,但它仅返回第一个元素的 uri。在此代码中,mThumbUri
始终为空。
public class UploadingService extends JobIntentService implements UploadCallBacks {
private static final String CHANNEL_ID = "upload_channel";
private static final int JOB_ID = 1000;
private HashMap<String, String> values;
String mVideoUri = "";
String mThumbUri = "";
private FirebaseUser mUser;
private String postId = null;
//Firebase
StorageReference storageRef = FirebaseStorage.getInstance().getReference();
DatabaseReference mDatabaseReference = FirebaseDatabase.getInstance().getReference();
public static void enqueueWork(Context context, Intent intent) {
enqueueWork(context, UploadingService.class, JOB_ID, intent);
}
@Override
public void onCreate() {
super.onCreate();
createNotificationChannel();
mUser = FirebaseAuth.getInstance().getCurrentUser();
}
@Override
protected void onHandleWork(@NonNull Intent intent) {
if (intent.hasExtra(AppConstants.DATA)) {
values = (HashMap<String, String>) intent.getSerializableExtra(AppConstants.DATA);
hitVideoUploadApi();
}
}
/**
* method for video upload
*/
private void hitVideoUploadApi() {
postId = UUID.randomUUID().toString();
ArrayList<Uri> files = new ArrayList<>();
Uri VideoUri = Uri.fromFile(new File(values.get(AppConstants.VIDEO_PATH)));
Uri ThumbUri = Uri.fromFile(new File(values.get(AppConstants.THUMB_PATH)));
files.add(VideoUri);
files.add(ThumbUri);
Notification notification = builder.build();
startForeground(NOTIFICATION_ID, notification);
使用循环,我将两个文件上传到 Firebase 存储中,并获取字符串 mVideoUrl 和 mThumbUrl 中的 url,以将这些字符串上传到 firebaseDatabase:
final int[] i = {0};
for (Uri uri : files) {
storageRef.child("PostData/" + UUID.randomUUID().toString()).putFile(uri).addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
@Override
public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
Task<Uri> uri = taskSnapshot.getStorage().getDownloadUrl().addOnCompleteListener(new OnCompleteListener<Uri>() {
@Override
public void onComplete(@NonNull Task<Uri> task) {
Uri uri = task.getResult();
i[0]++;
if (i[0] == 1) {
mVideoUri = uri.toString();
} else {
mThumbUri = uri.toString();
}
}
});
}
在 addOnCompleteListener 中调用一个 fun 将这些 url 上传到 firebase 实时数据库
}).addOnCompleteListener(new OnCompleteListener<UploadTask.TaskSnapshot>() {
@Override
public void onComplete(@NonNull Task<UploadTask.TaskSnapshot> task) {
hitUploadPostApi(mVideoUri, mThumbUri, postId);
}
}).addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
notificationManager.cancel(NOTIFICATION_ID);
Toast.makeText(getApplicationContext(), "Error while Uploading", Toast.LENGTH_SHORT).show();
}
});
}
}
最佳答案
上传完成后,您可以检查 Firebase 存储以获取所有文件的 URL(考虑到您知道文件名)。 我一年前写了这篇文章,当时它就有效了。
在 [child()] 方法中,您必须输入文件名。 另外,请记住 firebase 是异步的。
现在来看你的代码,我认为导致问题的是
最初 我[0]=0; 1个文件上传成功完成 我[0]=1, 2文件上传成功完成 我[0]=2。
但你正在检查 [if(i[0]==1)] {而第二次“i”是二}
关于java - 在回调中上传两个文件到 firebase 但无法获取这两个文件的DownloadUrl,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59398789/