Проблемы с загрузкой URL загруженного файла в Android Firebase - PullRequest
0 голосов
/ 30 сентября 2019

Я пытаюсь загрузить изображение профиля в хранилище Firebase, а затем сохранить его URL для загрузки в базу данных. Загрузка работает отлично, но у меня проблемы с URL-адресом загрузки. Я перепробовал почти все на переполнении стека. Я делюсь соответствующим кодом.

private String user_Name, user_Email, user_Password, user_Age, user_Phone, imageUri;
Uri imagePath;  

Выбор изображения

userProfilePic.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent();
                intent.setType("image/*");                                                              //Specify the type of intent
                intent.setAction(Intent.ACTION_GET_CONTENT);                                            //What action needs to be performed.
                startActivityForResult(Intent.createChooser(intent, "Select Image"), 
            }
        });

 @Override
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {           //Here we get the result from startActivityForResult().
        if(requestCode == PICK_IMAGE && resultCode == RESULT_OK && data.getData() != null){
            imagePath = data.getData();                                                                 //data.getData() holds the path of the file.
            try {
                Bitmap bitmap = MediaStore.Images.Media.getBitmap(getContentResolver(), imagePath);     //this converts the Uri to an image.
                userProfilePic.setImageBitmap(bitmap);
                imageTrue = 1;
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        super.onActivityResult(requestCode, resultCode, data);
    }

загрузка данных

 private void sendUserData (){
        FirebaseDatabase firebaseDatabase = FirebaseDatabase.getInstance();
        DatabaseReference myRef = firebaseDatabase.getReference("Users").child(firebaseAuth.getUid());
        final StorageReference imageReference = storageReference.child(firebaseAuth.getUid()).child("Images").child("Profile Pic");
                                                    //Here the root storage reference of our app storage is is "storageReference".
                                                    //.child(firebaseAuth.getUid()) creates a folder for every user. .child("images")
                                                    //creates another subfolder Images and the last child() function
                                                    //.child("Profile Pic") always gives the name of the file.
                                                    //User id/Images/profile_pic.png
                                                    //We can follow the same process for all other file types.

        if(imageTrue==1){
            UploadTask uploadTask = imageReference.putFile(imagePath);     //Now we need to upload the file.
            uploadTask.addOnFailureListener(new OnFailureListener() {
                @Override
                public void onFailure(@NonNull Exception e) {
                    Toast.makeText(getApplicationContext(), "File Upload Failed", Toast.LENGTH_SHORT).show();

                }
            }).addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
                @Override
                public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
                    imageReference.getDownloadUrl().addOnSuccessListener(new OnSuccessListener<Uri>() {
                        @Override
                        public void onSuccess(Uri uri) {
                            Uri downloadUri = uri;
                            imageUri = downloadUri.toString();

                        }
                    });
                    Toast.makeText(getApplicationContext(), "File Uploaded Successfully", Toast.LENGTH_SHORT).show();

                }
            });
        }


        UserProfile userProfile = new UserProfile(user_Name, user_Age, user_Email, user_Phone, imageUri);
        myRef.setValue(userProfile);
        Toast.makeText(getApplicationContext(), "User Data Sent.", Toast.LENGTH_SHORT).show();
    }

Ответы [ 2 ]

1 голос
/ 30 сентября 2019

в соответствии с Официальной документацией Firebase вы можете загрузить URl, используя метод UploadTask на addOnCompleteListener.

UploadTask uploadTask =null;
final StorageReference ref = storageReference.child(firebaseAuth.getUid()).child("Images").child("Profile Pic").child(imagePath);
uploadTask = ref.putFile(file);

Task<Uri> urlTask = uploadTask.continueWithTask(new Continuation<UploadTask.TaskSnapshot, Task<Uri>>() {
    @Override
    public Task<Uri> then(@NonNull Task<UploadTask.TaskSnapshot> task) throws Exception {
        if (!task.isSuccessful()) {
            throw task.getException();
        }

        // Continue with the task to get the download URL
        return ref.getDownloadUrl();
    }
}).addOnCompleteListener(new OnCompleteListener<Uri>() {
    @Override
    public void onComplete(@NonNull Task<Uri> task) {
        if (task.isSuccessful()) {
            Uri downloadUri = task.getResult();
          saveUserDetails(uri);
        } else {
            // Handle failures
            // ...
        }
    }
});

другим альтернативным способом, после загрузки изображения успешно запросите и получите вашURL изображения с помощью get downloadUrl.hope это может вам помочь!

private void getImageUrl(){
     storageReference.child(firebaseAuth.getUid()).child("Images").child("Profile Pic").child(imagePath).getDownloadUrl().addOnSuccessListener(new OnSuccessListener<Uri>() {
            @Override
            public void onSuccess(Uri uri) {
                saveUserDetails(uri);
            }
        }).addOnFailureListener(new OnFailureListener() {
            @Override
            public void onFailure(@NonNull Exception exception) {
                // Handle any errors
            }
        });

}
1 голос
/ 30 сентября 2019

Ваш код правильный. Вам просто нужно внести некоторые изменения в свой код в функции sendUserData () . Вы получите ваш imageUrl внутри onSuccess вашего UploadTask

  DatabaseReference myRef;

     private void sendUserData (){
            FirebaseDatabase firebaseDatabase = FirebaseDatabase.getInstance();
            myRef = firebaseDatabase.getReference("Users").child(firebaseAuth.getUid());
            final StorageReference imageReference = storageReference.child(firebaseAuth.getUid()).child("Images").child("Profile Pic");
                                                        //Here the root storage reference of our app storage is is "storageReference".
                                                        //.child(firebaseAuth.getUid()) creates a folder for every user. .child("images")
                                                        //creates another subfolder Images and the last child() function
                                                        //.child("Profile Pic") always gives the name of the file.
                                                        //User id/Images/profile_pic.png
                                                        //We can follow the same process for all other file types.

            if(imageTrue==1){
                UploadTask uploadTask = imageReference.putFile(imagePath);     //Now we need to upload the file.
                uploadTask.addOnFailureListener(new OnFailureListener() {
                    @Override
                    public void onFailure(@NonNull Exception e) {
                        Toast.makeText(getApplicationContext(), "File Upload Failed", Toast.LENGTH_SHORT).show();

                    }
                }).addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
                    @Override
                    public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
                        imageReference.getDownloadUrl().addOnSuccessListener(new OnSuccessListener<Uri>() {
                            @Override
                            public void onSuccess(Uri uri) {
                                Uri downloadUri = uri;
                                imageUri = downloadUri.toString();
                                saveUserDetails(imageUri); // Image uploaded
                            }
                        });
                        Toast.makeText(getApplicationContext(), "File Uploaded Successfully", Toast.LENGTH_SHORT).show();

                    }
                });
            }else{
                saveUserDetails(""); // Image not uploaded
            }
    }

Общая функция для saveUserDetails:

   public void saveUserDetails(String imageUri){

           UserProfile userProfile = new UserProfile(user_Name, user_Age, user_Email, user_Phone, imageUri);
                myRef.setValue(userProfile);
                Toast.makeText(getApplicationContext(), "User Data Sent.", Toast.LENGTH_SHORT).show();
     }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...