如何将图像的下载 URL 设置为 firestore 数据库和实时数据库

How do I set download URL for an image to firestore database and realtime Database

我已经实现了将用户照片上传到存储并将其检索到 firestore 和 realtimeDB 的代码。问题是当我将 imageuri 设置为数据库时:

然后我(或用户)将照片更新到 firebase,URI 成功更新到配置文件字符串..(firestore) 和图像 srting (realtimeDB)。但是在 time/after 应用程序关闭后,照片无法正确加载(或消失),它没有使用 firebase 令牌作为下载 Uri。

它是这样的: 内容://com.android.providers.media.documents/document/image%3A81399

然后我附加了另一个代码以从存储中获取更新的图像 URL。但是另一个问题

目前,两个数据库都没有存储 URLs

我附上了下面的代码。

public class ProfileFragment extends Fragment {


public ProfileFragment() {

}



@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
}


CircleImageView profileImageView;
FragmentProfileBinding binding;

private Uri photoUri;
private String imageUrl;


FirebaseFirestore firestore;
FirebaseStorage storage;
FirebaseAuth auth;
StorageReference storageReference;

DocumentReference documentReference;
DatabaseReference DBreference;
String currentUserId;

User user; //class




@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
   
    binding = FragmentProfileBinding.inflate(inflater, container, false);
    firestore = FirebaseFirestore.getInstance();
    auth = FirebaseAuth.getInstance();
    storage = FirebaseStorage.getInstance();



    auth = FirebaseAuth.getInstance();

    FirebaseUser fUser = FirebaseAuth.getInstance().getCurrentUser();
    currentUserId = fUser.getUid();


    documentReference = firestore.collection("Users").document(currentUserId);
    storageReference = FirebaseStorage.getInstance().getReference().child("Profile Pictures");
    DBreference = FirebaseDatabase.getInstance().getReference().child("Users");




    update = binding.updateBtn;
   
    profileImageView= binding.profilePhoto;



    clickListener();

    return binding.getRoot();



}

private void clickListener() {

    profileImageView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            Intent intent = new Intent();
            intent.setAction(Intent.ACTION_GET_CONTENT);
            intent.setType("image/*");
            //noinspection deprecation
            startActivityForResult(intent, 3);
        }
    });


   
    update.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            progressDialog.show();



            StorageReference reference = storage.getReference().child("Profile Pictures")
                    .child(FirebaseAuth.getInstance().getUid());

            reference.putFile(photoUri)
                    .addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
                @Override
                public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {


                    storageReference.getDownloadUrl().addOnSuccessListener(new OnSuccessListener<Uri>() {
                        @Override
                        public void onSuccess(Uri uri) {
                            imageUrl = uri.toString();

                            updateUserProfileToFirestore();


                            updateUserProfileToDataBase();

                        }
                    });


                }


            }).addOnProgressListener(new OnProgressListener<UploadTask.TaskSnapshot>() {
                @Override
                public void onProgress(@NonNull @NotNull UploadTask.TaskSnapshot snapshot) {


                    long totalSi = snapshot.getTotalByteCount();
                    long transferS = snapshot.getBytesTransferred();

                    long totalSize = (totalSi / 1024);
                    long transferSize = transferS / 1024;

                    progressDialog.setMessage("Uploaded " + ((int) transferSize) + "KB / " + ((int) totalSize) + "KB");


                }
            });



        }

    });






}



@SuppressWarnings("deprecation")
@Override
public void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
    super.onActivityResult(requestCode, resultCode, data);



    try {

        if (data.getData() != null) {

            photoUri = data.getData();

         //   profileImageView.setImageURI(imageUri);


        }

        Toast.makeText(getContext(), "Photo selected!", Toast.LENGTH_SHORT).show();

        }catch (Exception e){

        Toast.makeText(getContext(), "Error"+e, Toast.LENGTH_SHORT).show();

    }





}

private void updateUserProfileToFirestore() {


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

  profile.put("profile", imageUrl);



    final DocumentReference sDoc = firestore.collection("Users").document(FirebaseAuth.getInstance().getUid());
    firestore.runTransaction(new Transaction.Function<Void>() {


        @Override
        public Void apply(@NonNull  Transaction transaction) throws FirebaseFirestoreException {
            DocumentSnapshot snapshot = transaction.get(sDoc);


            transaction.update(sDoc, profile);

          //  transaction.update(sDoc, "name", binding.nameBox.getText() );

            return null;
        }


    }).addOnSuccessListener(new OnSuccessListener<Void>() {
        @Override
        public void onSuccess(Void unused) {


            progressDialog.setMessage("updated!");

            progressDialog.dismiss();
            Toast.makeText(getContext(), "Photo Updated!", Toast.LENGTH_LONG).show();
        }


    }).addOnFailureListener(new OnFailureListener() {
                @Override
                public void onFailure(@NonNull Exception e) {

                    progressDialog.setMessage("Can't upload");
                    progressDialog.dismiss();
                    Toast.makeText(getContext(), "Failed to update, try again later", Toast.LENGTH_SHORT).show();




                }
            });


   // final DatabaseReference




}


// Realtime database

private void updateUserProfileToDataBase() {

    HashMap<String, Object> map = new HashMap<>();
    map.put("image", imageUrl);

            DBreference.child(FirebaseAuth.getInstance().getUid())
                    .updateChildren(map)
                    .addOnCompleteListener(new OnCompleteListener<Void>() {
                        @Override
                        public void onComplete(@NonNull Task<Void> task) {
                            progressDialog.dismiss();
                        }
                    }).addOnSuccessListener(new OnSuccessListener<Void>() {
                @Override
                public void onSuccess(Void unused) {

                    Toast.makeText(getContext(), "Success", Toast.LENGTH_SHORT).show();


                }
            }).addOnFailureListener(new OnFailureListener() {
                @Override
                public void onFailure(@NonNull @NotNull Exception e) {
                    Toast.makeText(getContext(), "Failed!", Toast.LENGTH_SHORT).show();
                }
            });


}

}

已解决!它基于存储参考。刚刚改为“参考”。

因为我已经声明了存储引用。但是我输入了两次