Android загрузка изображения профиля для аутентифицированного пользователя Firebase - PullRequest
0 голосов
/ 16 января 2020

Я пытаюсь добавить изображение в хранилище Firebase, где каждый пользователь может загрузить свое изображение профиля из своих файлов или камеры, и оно должно храниться в его собственной папке, в которой в качестве имени указан его uid. У меня есть следующий код, однако нажатие на ImageView ничего не делает:

public class ProfileFragment extends Fragment {

    CircleImageView profileImage;
    TextView email;

    public StorageReference storageRef;
    FirebaseStorage storage;


    public static ProfileFragment newInstance() {
        ProfileFragment profileFragment = new ProfileFragment();
        return profileFragment;
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {

        View view = inflater.inflate(R.layout.fragment_profile, container, false);

        profileImage = view.findViewById(R.id.profile_image);
        email = view.findViewById(R.id.email);

        String user = FirebaseAuth.getInstance().getCurrentUser().getEmail();
        email.setText(user);

        storageRef = storage.getReference();

        return view;
    }

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

        final String userUid = FirebaseAuth.getInstance().getCurrentUser().getUid();
        final Uri contentURI = data.getData();

        profileImage.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if(contentURI != null) {

                    StorageReference childRef = storageRef.child("/images/"+ userUid +".jpg");

                    UploadTask uploadTask = childRef.putFile(contentURI);
                    uploadTask.addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
                        @Override
                        public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
                            Toast.makeText(getActivity(), "Upload successful", Toast.LENGTH_SHORT).show();
                        }
                    }).addOnFailureListener(new OnFailureListener() {
                        @Override
                        public void onFailure(@NonNull Exception e) {
                            Toast.makeText(getActivity(), "Upload Failed" + e, Toast.LENGTH_SHORT).show();
                        }
                    });
                }
                else {
                    Toast.makeText(getActivity(), "Select an image", Toast.LENGTH_SHORT).show();
                }
            }
        });
    }
}

Из того, что я прочитал, onActivityResult не работает с фрагментами, однако я не могу думать или найти какие-либо темы о том, как это должно быть сделано для работы. Может ли кто-нибудь помочь мне с этой работой, а также, как мне получить фотографию профиля каждого пользователя после того, как я ее загрузил? Я использую встроенную систему аутентификации Firebase с аутентификацией электронной почты, Google и Facebook, и пытаюсь заставить ее работать без дополнительного хранения пользователей в базе данных. Заранее спасибо!

1 Ответ

0 голосов
/ 16 января 2020

Попробуйте следующий фрагмент:

Шаг 1: - Добавьте зависимость хранилища firebase в файл build.gradle (Module: app). Последней зависимостью для хранилища Firebase является:

 implementation 'com.google.firebase:firebase-storage:19.1.0'

Шаг 2: -Настройка Activity_main. xml Файл макета

Шаг 3: -Настройка MainActivity. java file

FirebaseStorage  storage = FirebaseStorage.getInstance(); 
StorageReference  storageReference = storage.getReference();

        private void uploadImage() 
        { 
            if (filePath != null) { 

                // Code for showing progressDialog while uploading 
                ProgressDialog progressDialog = new ProgressDialog(this); 
                progressDialog.setTitle("Uploading..."); 
                progressDialog.show(); 

                // Defining the child of storageReference 
                StorageReferenceref=storageReference.child("images/"+UUID.randomUUID().toString(); 

                // adding listeners on upload 
                // or failure of image 
                ref.putFile(filePath) 
                    .addOnSuccessListener( 
                        new OnSuccessListener<UploadTask.TaskSnapshot>() { 

                            @Override
                            public void onSuccess( 
                                UploadTask.TaskSnapshot taskSnapshot) 
                            { 

                                // Image uploaded successfully 
                                // Dismiss dialog 
                                progressDialog.dismiss(); 
                                Toast 
                                    .makeText(MainActivity.this, 
                                              "Image Uploaded!!", 
                                              Toast.LENGTH_SHORT) 
                                    .show(); 
                            } 
                        }) 

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

                            // Error, Image not uploaded 
                            progressDialog.dismiss(); 
                            Toast 
                                .makeText(MainActivity.this, 
                                          "Failed " + e.getMessage(), 
                                          Toast.LENGTH_SHORT) 
                                .show(); 
                        } 
                    }) 
                    .addOnProgressListener( 
                        new OnProgressListener<UploadTask.TaskSnapshot>() { 

                            // Progress Listener for loading 
                            // percentage on the dialog box 
                            @Override
                            public void onProgress( 
                                UploadTask.TaskSnapshot taskSnapshot) 
                            { 
                                double progress 
                                    = (100.0
                                       * taskSnapshot.getBytesTransferred() 
                                       / taskSnapshot.getTotalByteCount()); 
                                progressDialog.setMessage( 
                                    "Uploaded "
                                    + (int)progress + "%"); 
                            } 
                        }); 
            } 
        } 
...