Android Firebase - 使用个人资料照片进行用户注册

时间:2017-11-09 03:49:04

标签: android image firebase firebase-authentication registration

我一直在浏览Firebase文档,以及在stackoverflow,google和YouTube上搜索以下内容:

创建允许电子邮件,密码和个人资料照片的用户注册。

我能够成功添加用户的电子邮件和密码,但我似乎无法获取其他信息(最重要的是个人资料照片)。所有教程和文档都显示了某人(已登录)用户是如何将照片上传到firebase的,而不是针对正在注册的人。有人可以在这里帮忙,我如何获得新用户上传的个人资料照片和名字/姓氏?

我正在使用FirebaseAuth添加用户。

这是我到目前为止所做的:

checkmarkImage.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {


        auth.createUserWithEmailAndPassword(emailET.getText().toString(), passwordET.getText().toString())
            .addOnCompleteListener(RegisterActivity.this, new OnCompleteListener() {
                            @Override
                            public void onComplete(@NonNull Task task) {
                                        Toast.makeText(RegisterActivity.this, "createUserWithEmail:onComplete:" + task.isSuccessful(), Toast.LENGTH_SHORT).show();
                                          //progressBar.setVisibility(View.GONE);
                                if (!task.isSuccessful()) {
                                              Toast.makeText(RegisterActivity.this, "Authentication failed." + task.getException(),
                                                      Toast.LENGTH_SHORT).show();
                                } else {
                                        startActivity(new Intent(RegisterActivity.this, HomeActivity.class));
                                        finish();
                                          }
                                          }
                                  });
                      }
                  });

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


    }

    //END OF onCreate

    //Separate methods

    //Actually opens the CameraRoll
        public void handleChooseImage(View v) {
            Intent i = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
            startActivityForResult(i, SELECTED_PICTURE);  //then goes to onActivityResult
        }
        public void handleInsertData(View v) {

        }

    public void onActivityResult(int requestCode, int resultCode, Intent imageReturnedIntent) {
        super.onActivityResult(requestCode, resultCode, imageReturnedIntent);
        switch (requestCode) {
            case 0:
                if(requestCode == RESULT_OK) {
                    Log.i("RegisterActivity", "case 0");
                }
                break;
            case 1:
                if(resultCode == RESULT_OK) {
                    Uri selectedImage = imageReturnedIntent.getData();
                    Log.i("RegisterActivity", "selected image = " + selectedImage);

                }
                break;
        }
    }
}

3 个答案:

答案 0 :(得分:0)

您需要先注册,然后以标准方式将用户图像上传到存储中。

因为根据firebase存储默认规则user != null所以用户身份验证状态必须不为null,否则你可以将firebase规则更改为public(它不是优选的)

我希望这会对你有所帮助。

auth.createUserWithEmailAndPassword(email, password)
                        .addOnCompleteListener(SignupActivity.this, new OnCompleteListener<AuthResult>() {
                            @Override
                            public void onComplete(@NonNull Task<AuthResult> task) {
                                     if (!task.isSuccessful()) {
                                    aDialog.show();
                                } else {
                                    final String uid = task.getResult().getUser().getUid();

                                    StorageReference filepath = mStorage.child("user_profile").child(mImageUri.getLastPathSegment());
                                    filepath.putFile(mImageUri).addOnProgressListener(new OnProgressListener<UploadTask.TaskSnapshot>() {
                                        @Override
                                        public void onProgress(UploadTask.TaskSnapshot taskSnapshot) {
                                            double progress = (100.0 * taskSnapshot.getBytesTransferred()) / taskSnapshot.getTotalByteCount();
                                            if (progress == 100) {
                                                hideProgressDialog();
                                                //upload();
                                            }
                                            System.out.println("Upload is " + progress + "% done");
                                        }
                                    }).addOnPausedListener(new OnPausedListener<UploadTask.TaskSnapshot>() {
                                        @Override
                                        public void onPaused(UploadTask.TaskSnapshot taskSnapshot) {
                                            System.out.println("Upload is paused");
                                        }
                                    }).addOnFailureListener(new OnFailureListener() {
                                        @Override
                                        public void onFailure(@NonNull Exception exception) {
                                            // Handle unsuccessful uploads
                                        }
                                    }).addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
                                        @Override
                                        public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
                                            /** Get Image Download Path**/
                                            Uri downloadUri = taskSnapshot.getDownloadUrl();

                                            /** Converting Image Uri In String **/

                                            if (downloadUri != null) {
                                                imagerls = downloadUri.toString();
                                            }

                                            //Add user data and image URL to firebase database
                                        }

                                    });
                                }
                            }
                        });

答案 1 :(得分:0)

无论用户在firebase上注册,您都可以上传图片, 但是,当用户登录时,您需要用户参考来保存图像以再次获取它,如果用户尚未注册,则您无法获得该用户的参考。 说得通? :)

答案 2 :(得分:0)

可能有点晚了,但是对于任何来这里寻求可靠答案的人,我将向您展示我是如何实现这一目标的。

我有一个POJO类CreatedUserDetail,其中包含电子邮件和照片字段。

我还创建了一个User类:

public class User{
private String uid;
private String password;
private String email;
private String photo;

public User( String email, String photo, String password ){
    this.email = email;
    this.photo = photo;
    this.password = password;
}

public void saveToFirebase(){
    CreatedUserDetail userDetail = new CreatedUserDetail();
    userDetail.setEmail( email );
    userDetail.setImage( photo );

    FirebaseDatabase.getInstance()
            .getReference()
            .child( "Users" )
            .child( uid ).setValue( userDetail );
}

private void uploadProfileImage(){
    final StorageReference mStorageReference = FirebaseStorage.getInstance()
            .getReference()
            .child( "pics" +
                    uid +
                    photo.substring( photo.lastIndexOf( "." ) ) );

    UploadTask uploadTask = mStorageReference.putFile( Uri.fromFile( new File( photo ) ) );
    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();

            return mStorageReference.getDownloadUrl();
            }
        } ).addOnCompleteListener( new OnCompleteListener< Uri >(){
        @Override
        public void onComplete( @NonNull Task< Uri > task ){
            if( task.isSuccessful() ){
                photo = task.getResult().toString();
                FirebaseDatabase.getInstance().getReference( "Users" )
                        .child( uid )
                        .child( "image" )
                        .setValue( photo );
            }
        }
    } );
}

public void RegisterUser( final OnUserRegistrationCallback onUserRegistrationCallback ){
    FirebaseAuth.getInstance()
            .createUserWithEmailAndPassword( email, password )
            .addOnSuccessListener( new OnSuccessListener< AuthResult >(){
                @Override
                public void onSuccess( AuthResult authResult ){
                    uid = authResult.getUser().getUid();
                    saveToFirebase();
                    uploadProfileImage();
                }
            } )
            .addOnFailureListener( new OnFailureListener(){
                @Override
                public void onFailure( @NonNull Exception e ){
                }
            } );
}

}

如您所见,它具有RegisterUser函数,该函数首先使用给定的电子邮件和密码在Firebase Authentication中创建一个用户。注册后,我将在Firebase数据库中创建一个用户,并使用电子邮件和本地照片路径。同时,它还将照片上传到Firebase Storage。最后,上传完成后,我用最近上传的照片的downloadUrl更新了Firebase数据库节点。

在活动中,我只是这样做:

    mUserWithEmailAndPassword = new User( mEmailToVerify, mLocalPath, mPass );
    mUserWithEmailAndPassword.RegisterUser();

仅此而已。您可以添加一个回调来显示Toast或重定向到另一个活动。