java - 在回调中上传两个文件到 firebase 但无法获取这两个文件的DownloadUrl

标签 java android firebase callback firebase-storage

我正在从 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 存储中,并获取字符串 mVideoUrlmThumbUrl 中的 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(考虑到您知道文件名)。 我一年前写了这篇文章,当时它就有效了。

enter image description here

在 [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/

相关文章:

java - 对 LinkedList 中 ListIterator 的 add() 方法感到困惑

android - 你如何检查android中的互联网连接?

xcode - 如何将 tensorflow-lite 模型转换为 coreml .mlmodel

java - MySql 无法在 Amazon EC2 上运行

java - 变量命名接口(interface)

java - Java生成1到10的6个不同数字

android - Gradle 多项目构建因 UnsupportedNotationException 失败

android - jQuery Mobile - 仅当侧面板关闭时才允许滚动?

ios - 如何将查询中的数据保存在字符串数组中,Firebase iOS?

android - 在登录节点下的 Firebase 中保存总分