首页 > 解决方案 > 上传个人资料图片并继续下一步

问题描述

我有两个活动。SetupActivity.java 和 ProfileImageActivity.java。

设置活动.java

   public class SetupActivity extends AppCompatActivity
{
    @BindView(R.id.setup_name) EditText _nameText;
    @BindView(R.id.setup_username) EditText _userNameText;
    @BindView(R.id.setup_blood_group) EditText _bloodGroupText;
    @BindView(R.id.setup_mobile) EditText _mobileText;
    @BindView(R.id.save_profile_button) Button _saveProfileButton;
    //private CircleImageView ProfileImage;
    private ProgressDialog loadingBar;

    private FirebaseAuth mAuth;
    private DatabaseReference UsersRef;
    String currentUserID;
    final static int Gallery_Pick = 1;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_setup);
        ButterKnife.bind(this);

        mAuth = FirebaseAuth.getInstance();
        currentUserID = mAuth.getInstance().getCurrentUser().getUid();
        UsersRef = FirebaseDatabase.getInstance().getReference().child("Users").child(currentUserID);
        loadingBar = new ProgressDialog(this);


        _saveProfileButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                SaveAccountSetupInformation();
            }

        });
    }
    private void SaveAccountSetupInformation()
    {
        String fullname=_nameText.getText().toString();
        String username = _userNameText.getText().toString();
        String mobilenumber = _mobileText.getText().toString();
        String bloodgroup = _bloodGroupText.getText().toString();

        if(TextUtils.isEmpty(username))
        {
            Toast.makeText(this, "Please write your username...", Toast.LENGTH_SHORT).show();
        }
        if(TextUtils.isEmpty(mobilenumber))
        {
            Toast.makeText(this, "Please give your mobile number...", Toast.LENGTH_SHORT).show();
        }
        if(TextUtils.isEmpty(bloodgroup))
        {
            Toast.makeText(this, "Please give your exact blood group...", Toast.LENGTH_SHORT).show();
        }
        if(TextUtils.isEmpty(fullname))
        {
            Toast.makeText(this, "Please give your fullname..", Toast.LENGTH_SHORT).show();
        }
        else
        {
            loadingBar.setTitle("Saving Information");
            loadingBar.setMessage("Please wait, while we are creating your new Account...");
            loadingBar.show();
            loadingBar.setCanceledOnTouchOutside(true);

            HashMap userMap = new HashMap();
            userMap.put("username", username);
            userMap.put("fullname",fullname);
            userMap.put("mobilenumber", mobilenumber);
            userMap.put("bloodgroup", bloodgroup);
            userMap.put("status", "Hey there, i am using Kaarai Siragugal Android App.");
            userMap.put("gender", "none");
            userMap.put("dob", "none");
            userMap.put("relationshipstatus", "none");
            UsersRef.updateChildren(userMap).addOnCompleteListener(new OnCompleteListener() {
                @Override
                public void onComplete(@NonNull Task task)
                {
                    if(task.isSuccessful())
                    {
                        SendUserToProfileImageActivity();
                        Toast.makeText(SetupActivity.this, "your Account is created Successfully.", Toast.LENGTH_LONG).show();
                        loadingBar.dismiss();
                    }
                    else
                    {
                        String message =  task.getException().getMessage();
                        Toast.makeText(SetupActivity.this, "Error Occured: " + message, Toast.LENGTH_SHORT).show();
                        loadingBar.dismiss();
                    }
                }
            });
        }
    }



    private void SendUserToProfileImageActivity()
    {
        Intent mainIntent = new Intent(SetupActivity.this, ProfileImageActivity.class);
        mainIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
        startActivity(mainIntent);
        finish();
    }
}

ProfileImageActivity.java

    public class ProfileImageActivity extends AppCompatActivity {
    private CircleImageView ProfileImage;
    private FirebaseAuth mAuth;
    private ProgressDialog loadingBar;
    private StorageReference UserProfileImageRef;
    String currentUserID;
    final static int Gallery_Pick = 1;
    @BindView(R.id.save_profile_image_button)
    Button _saveProfileImageButton;
    private DatabaseReference UsersRef;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_profile_image);
        ButterKnife.bind(this);
        mAuth = FirebaseAuth.getInstance();
        ProfileImage = (CircleImageView) findViewById(R.id.save_profile_image);
        UsersRef = FirebaseDatabase.getInstance().getReference().child("Users").child(currentUserID);
        currentUserID = mAuth.getInstance().getCurrentUser().getUid();
        UserProfileImageRef = FirebaseStorage.getInstance().getReference().child("Profile Images");
        ProfileImage = (CircleImageView) findViewById(R.id.save_profile_image);
        loadingBar = new ProgressDialog(this);
        _saveProfileImageButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                SaveProfileImage();
            }
        });
        ProfileImage.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent galleryIntent = new Intent();
                galleryIntent.setAction(Intent.ACTION_GET_CONTENT);
                galleryIntent.setType("image/*");
                startActivityForResult(galleryIntent, Gallery_Pick);
            }
        });

    }





    private void SaveProfileImage() {
        UsersRef.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                if (dataSnapshot.exists()) {
                    if (dataSnapshot.hasChild("profileimage")) {
                        String image = dataSnapshot.child("profileimage").getValue().toString();
                        Picasso.get().load(image).placeholder(R.drawable.profile).into(ProfileImage);
                    } else {
                        Toast.makeText(ProfileImageActivity.this, "Please select profile image first.", Toast.LENGTH_SHORT).show();

                    }
                }
            }

            @Override
            public void onCancelled(DatabaseError databaseError) {

            }
        });
    }


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

        if (requestCode == Gallery_Pick && resultCode == RESULT_OK && data != null) {
            Uri imageUri = data.getData();

            CropImage.activity()
                    .setGuidelines(CropImageView.Guidelines.ON)
                    .setAspectRatio(1, 1)
                    .start(this);
        }

        // Cuando se pulsa en el crop button
        if (requestCode == CropImage.CROP_IMAGE_ACTIVITY_REQUEST_CODE) {
            CropImage.ActivityResult result = CropImage.getActivityResult(data);

            if (resultCode == RESULT_OK) {

                loadingBar.setTitle("Profile Image");
                loadingBar.setMessage("Wait while we save your image...");
                loadingBar.show();
                loadingBar.setCanceledOnTouchOutside(true);

                Uri resultUri = result.getUri();

                StorageReference filePath = UserProfileImageRef.child(currentUserID + ".jpg");

                filePath.putFile(resultUri).addOnCompleteListener(new OnCompleteListener<UploadTask.TaskSnapshot>() {
                    @Override
                    public void onComplete(@NonNull Task<UploadTask.TaskSnapshot> task) {
                        if (task.isSuccessful()) {

                            Toast.makeText(ProfileImageActivity.this, "Your image has been saved...", Toast.LENGTH_SHORT).show();

                            Task<Uri> result = task.getResult().getMetadata().getReference().getDownloadUrl();

                            result.addOnSuccessListener(new OnSuccessListener<Uri>() {
                                @Override
                                public void onSuccess(Uri uri) {
                                    final String downloadUrl = uri.toString();

                                    UsersRef.child("profileimage").setValue(downloadUrl)
                                            .addOnCompleteListener(new OnCompleteListener<Void>() {
                                                @Override
                                                public void onComplete(@NonNull Task<Void> task) {
                                                    if (task.isSuccessful()) {
                                                        Intent selfIntent = new Intent(ProfileImageActivity.this, ProfileImageActivity.class);
                                                        startActivity(selfIntent);

                                                        Toast.makeText(ProfileImageActivity.this, "Your Image looks beautiful...", Toast.LENGTH_SHORT).show();
                                                        loadingBar.dismiss();
                                                        Intent MainIntent=new Intent(ProfileImageActivity.this,MainActivity.class);
                                                        startActivity(MainIntent);
                                                        MainIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
                                                        finish();
                                                    } else {
                                                        String message = task.getException().getMessage();
                                                        Toast.makeText(ProfileImageActivity.this, "Error: " + message, Toast.LENGTH_SHORT).show();
                                                        loadingBar.dismiss();
                                                    }
                                                }
                                            });
                                }
                            });
                        }
                    }
                });
            } else {
                Toast.makeText(ProfileImageActivity.this, "Error: \n" + "The image has not been cropped well. Try again.", Toast.LENGTH_SHORT).show();
                loadingBar.dismiss();
            }
        }
    }
    }

SetupActivity.java 获取用户信息,例如姓名、用户名、血型和手机号码,并将其保存到 Firebase 数据库。它运行良好。ProfileImageActivity.java 应该获取用户裁剪的个人资料图像,并且必须将其保存到用户的数据库中。对于裁剪,我使用了来自 github 的存储库。在 setupActivity 之后,应用程序崩溃说

 Caused by: java.lang.NullPointerException: Can't pass null for argument 'pathString' in child()
    at com.google.firebase.database.DatabaseReference.child(com.google.firebase:firebase-database@@16.0.5:101)
    at blackevil.com.kaaraisiragugal.ProfileImageActivity.onCreate(ProfileImageActivity.java:52)

并且应用程序也会退出,但 SetupActivity 中给出的信息已正确保存到数据库中。而且我还需要阻止用户从 ProfileImageActivity 进入下一个活动而不选择个人资料图像。

标签: javaandroid

解决方案


在您的代码中,您有

UsersRef = FirebaseDatabase.getInstance().getReference().child("Users").child(currentUserID);
currentUserID = mAuth.getInstance().getCurrentUser().getUid();

currentUserID中.child(currentUserID)的位置为 null ,因为您在第二行中获取 currentUserID 。

严重地!?

它应该如下所示:

currentUserID = mAuth.getInstance().getCurrentUser().getUid();
UsersRef = FirebaseDatabase.getInstance().getReference().child("Users").child(currentUserID);

推荐阅读