Android为Firebase身份验证的用户上传个人资料图片

时间:2020-01-16 13:18:42

标签: android firebase android-fragments firebase-authentication

我正在尝试将图像添加到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不适用于片段,但是我无法思考或找到任何有关如何完成工作的主题。有人可以帮我完成这项工作吗?此外,上传后如何获取每个用户的个人资料图片?我正在使用带有电子邮件,谷歌和Facebook身份验证的内置Firebase身份验证系统,并且正在尝试使其在不将用户另外存储在数据库中的情况下正常运行。 预先感谢!

1 个答案:

答案 0 :(得分:0)

在以下代码段中尝试以下内容:

步骤1:-在build.gradle(Module:app)文件中添加firebase存储依赖项。 Firebase存储的最新依赖关系是:

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

步骤2:-设置activity_main.xml布局文件

第3步:-设置MainActivity.java文件

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 + "%"); 
                            } 
                        }); 
            } 
        }