首页 文章

Android Firebase - 使用 Profiles 照片进行用户注册

提问于
浏览
2

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

创建允许电子邮件,密码和 Profiles 照片的用户注册 .

我能够成功地为用户添加他们的电子邮件和密码,但我似乎无法获取其他信息(最重要的是 Profiles 照片) . 所有教程和文档都显示了某人(已登录)用户可以如何将照片上传到firebase,但不能将某人注册 . 有人可以帮忙,我怎样才能获得新用户上传的 Profiles 照片和名字/姓氏?

我正在使用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

    这可能有点晚了,但是对于其他来这里寻求可靠答案的人,我会告诉你我是如何做到的 .

    我有一个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身份验证中创建用户 . 注册后,我在Firebase数据库中创建了一个用户,其中包含电子邮件和LOCAL PATH照片 . 同时,它还会将照片上传到Firebase存储 . 最后,在完成上传后,我使用最近上传的照片的downloadUrl更新Firebase数据库节点 .

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

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

    就这样 . 您可以包含一个回调来显示Toast或重定向到另一个活动 .

  • 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
                                            }
    
                                        });
                                    }
                                }
                            });
    
  • 0

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

相关问题