繁体   English   中英

为什么我的图像数据 url 没有保存在 firebase 火库中?

[英]Why my image's data url is not saving in firebase firestore?

我正在开发一个应用程序,我需要将多个图像写入 firebase 存储并将其 URL 保存到 firestore 数据库。 我能够将数据写入存储,但它的 url 没有保存在 Firestore 数据库中。 请指导我如何在我做错的地方实现这一目标。

我的代码

    activityResultLauncher = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), new ActivityResultCallback<ActivityResult>() {
        @Override
        public void onActivityResult(ActivityResult result) {

            if (result.getResultCode() == RESULT_OK && null != result.getData()) {

                if (result.getData().getClipData() != null) {

                    //this part to get multiple images
                    int countOfImages = result.getData().getClipData().getItemCount();
                    for (int i = 0; i < countOfImages; i++) {
                     // limiting the number of images picked up from gallery
                        if (uri.size() < 11) {
                            Uri imageuri = result.getData().getClipData().getItemAt(i).getUri();
                            uri.add(imageuri);
                            String imageName = getfilename(imageuri);

                            StorageReference mref =  reference.child("RoomsImages").child(imageName);
                          
                            mref.putFile(imageuri).addOnCompleteListener(new OnCompleteListener<UploadTask.TaskSnapshot>() {
                                @Override
                                public void onComplete(@NonNull Task<UploadTask.TaskSnapshot> task) {
                                    if (task.isSuccessful()) {
                                                saveImageDataToFirestore();
                                Toast.makeText(MainActivity.this, "Data Added to firebase storage", Toast.LENGTH_SHORT).show();


                                        mref.getDownloadUrl().addOnCompleteListener(new OnCompleteListener<Uri>() {
                                            @Override
                                            public void onComplete(@NonNull Task<Uri> task) {
                                                savedImagesUri.add(task.getResult().toString());

                                            }
                                        });
                                    }

                                }
                            });
                        } else {

                            Toast.makeText(MainActivity.this, "Not Allowed more than 11 images", Toast.LENGTH_SHORT).show();

                        }

                    }
                    //this to notify
                    adapter.notifyDataSetChanged();
                    rentSell3Binding.totalphotos.setText("Photos (" + uri.size() + ")");

                } 

Firestore 代码

   private void saveImageDataToFirestore() {

    Map<String, Object> dataMap = new HashMap<>();

    //Below line of code will put your images list as an array in firestore
    dataMap.put("images", savedImagesUri);
    
    collectionReference.add(dataMap).addOnSuccessListener(new OnSuccessListener<DocumentReference>() {
        @Override
        public void onSuccess(DocumentReference documentReference) {
            Toast.makeText(MainActivity.this, "Images Uploaded and saved successfully", Toast.LENGTH_SHORT).show();

        }
    }).addOnFailureListener(new OnFailureListener() {
        @Override
        public void onFailure(@NonNull Exception e) {
            //  coreHelper.createAlert("Error", "Images uploaded but we couldn't save them to database.", "OK", "", null, null, null);
            Toast.makeText(MainActivity.this, "Images uploaded but we couldn't save them to database.", Toast.LENGTH_SHORT).show();
            Log.e("MainActivity:SaveData", e.getMessage());
        }
    });
}

每次图像上传完成时,您都将整个图像 URL 数组写入 Firebase,但如果是最新上传,则在下载 URL之前这样做。 所以这意味着你最终会错过你上传的最后一张图片的下载 URL。

要解决此问题,请将写入 Firestore 的代码移动下载 URL 后运行的onComplete中:

mref.putFile(imageuri).addOnCompleteListener(new OnCompleteListener<UploadTask.TaskSnapshot>() {
    @Override
    public void onComplete(@NonNull Task<UploadTask.TaskSnapshot> task) {
        if (task.isSuccessful()) {
            Toast.makeText(MainActivity.this, "Data Added to firebase storage", Toast.LENGTH_SHORT).show();

            mref.getDownloadUrl().addOnCompleteListener(new OnCompleteListener<Uri>() {
                @Override
                public void onComplete(@NonNull Task<Uri> task) {
                    savedImagesUri.add(task.getResult().toString());
                    saveImageDataToFirestore(); // 👈
                }
            });
        }
    }
});

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM