Android 如何使用Firebase Auth和Firebase存储gmail、姓名和google个人资料图片

Android 如何使用Firebase Auth和Firebase存储gmail、姓名和google个人资料图片,android,firebase,firebase-authentication,navigation-drawer,Android,Firebase,Firebase Authentication,Navigation Drawer,我正在用FireBase和FireBaseAuth为谷歌登录制作一个Android应用程序。我的数据库中没有用户表,因此FireBaseAuth除了对用户进行身份验证之外,没有做其他什么 我在主屏幕(主屏幕)上有一个NavigationDrawer,我希望在这里显示用户的个人资料图片、姓名和电子邮件。如此示例(但只有一个帐户/图片): 用户无需登录即可使用应用程序,但某些活动(如写评论)需要用户登录。如果用户未登录,则不必在NavigationDrawer中显示有关该用户的任何信息。但是,如果

我正在用FireBase和FireBaseAuth为谷歌登录制作一个Android应用程序。我的数据库中没有用户表,因此FireBaseAuth除了对用户进行身份验证之外,没有做其他什么

我在主屏幕(主屏幕)上有一个NavigationDrawer,我希望在这里显示用户的个人资料图片、姓名和电子邮件。如此示例(但只有一个帐户/图片):

用户无需登录即可使用应用程序,但某些活动(如写评论)需要用户登录。如果用户未登录,则不必在NavigationDrawer中显示有关该用户的任何信息。但是,如果有一个已登录的用户,则其信息应如示例所示显示

这是我在ReviewActivity中的FireBaseAuth代码:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_reviews);

    //  Setting up the toolbar:
    Toolbar toolbar = findViewById(R.id.Activity_Review_Toolbar);
    toolbar.setTitle("Write a review");

    //  Setting up the database:
    firebaseDatabase = FirebaseDatabase.getInstance();
    firebaseAuth = FirebaseAuth.getInstance();
    reviewDatabaseReference = firebaseDatabase.getReference().child("Reviews");

    firebaseAuthStateListener = new FirebaseAuth.AuthStateListener() {
        @Override
        public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) {
            FirebaseUser firebaseUser = firebaseAuth.getCurrentUser();
            if (firebaseUser != null) {
                // Already logged in
            }
            else {
                onSignedOutCleanup();
                // Not signed in
                startActivityForResult(
                    AuthUI.getInstance()
                        .createSignInIntentBuilder()
                        .setIsSmartLockEnabled(false)
                        .setAvailableProviders(
                            Arrays.asList(new AuthUI.IdpConfig.Builder(AuthUI.EMAIL_PROVIDER).build(),
                            new AuthUI.IdpConfig.Builder(AuthUI.GOOGLE_PROVIDER).build()))
                        .build(),
                    RC_SIGN_IN);
            }
        }
    };
}
用户登录非常有效,但我的问题是,如何根据FireBaseAuth提供的Google信息存储用户信息?(我相信我必须为用户创建一个用户模型和一个表)


感谢您的帮助,谢谢

假设您正在firebase实时数据库上保存数据

步骤1.从注册中获取用户信息。 我用的是一封简单的电子邮件和密码

SignUpService

public void signUpWithEmail(String email, String password) {
    this.firebaseAuth.createUserWithEmailAndPassword(email, password).addOnCompleteListener(task -> {
        if(task.isSuccessful()) {
            //Has the means to create a user (code step 3)
            UserService userService = new UserService();
            //A simple firebase user
            FirebaseUser firebaseUser =  task.getResult().getUser();
            //Your version of a user that is optionally converted from a firebase user                
            UserEntity userEntity =  userService.convertFirebaseUserToUser(firebaseUser);
            //create the user (code below)
            userService.create(userEntity).subscribe(reference -> Log.i(SignUpService.TAG, reference.toString()));

        }else{
            Log.e(TAG, "Couldnt sign user up");
        }

    });
    return;
}
第2步。(可选)将FirebaseUser转换为符合您业务规则的用户

//Takes a firebase user and converts them into a user based on your business rules

public UserEntity convertFirebaseUserToUser(FirebaseUser firebaseUser)
{
UserEntity userEntity = new UserEntity();
    userEntity.setDisplayName(firebaseUser.getDisplayName());
    userEntity.setEmail(firebaseUser.getEmail());
    userEntity.setDisplayPhoto(firebaseUser.getDisplayName());
    userEntity.setKey(firebaseUser.getUid());
    return userEntity;
}
3。创建用户

/**
 * Takes a user entity and creates one
 * @param userEntity
 * @return
 */
public void create(UserEntity userEntity) {
    //initialise your backend
    FirebaseDatabase firebaseDatabase = FirebaseDatabase.getInstance();
    DatabaseReference databaseReference;

    //retrieve the firebase key for the user you are about to add
    databaseReference = firebaseDatabase.getReference(BASE_PATH).push();
    String key = databaseReference.getKey();
    //create a user hashmap, with the user key as the hashmaps key, and the user entity as the value <K,V>
    Map<String, Object> userEntityHashMap = new HashMap<>();
    userEntityHashMap.put(key, userEntity);

    //create a listenner for your result
    DatabaseReference.CompletionListener completionListener = new DatabaseReference.CompletionListener() {
        @Override
        public void onComplete(DatabaseError databaseError, DatabaseReference databaseReference) {
            //returns the reference to your newly created user
            if(databaseError != null) {
                //handle the incoming user creation error
            }
        }
    };
    databaseReference.setValue(userEntity, completionListener);
    return;
}
/**
*获取一个用户实体并创建一个
*@param userEntity
*@返回
*/
公共void创建(UserEntity UserEntity){
//初始化后端
FirebaseDatabase=FirebaseDatabase.getInstance();
数据库参考数据库参考;
//检索要添加的用户的firebase密钥
databaseReference=firebaseDatabase.getReference(BASE_PATH).push();
String key=databaseReference.getKey();
//创建一个用户hashmap,用户键作为hashmaps键,用户实体作为值
Map userEntityHashMap=新建HashMap();
userEntityHashMap.put(key,userEntity);
//为结果创建一个列表器
DatabaseReference.CompletionListener CompletionListener=新建DatabaseReference.CompletionListener(){
@凌驾
public void onComplete(DatabaseError DatabaseError,DatabaseReference DatabaseReference){
//返回对新创建用户的引用
if(databaseError!=null){
//处理传入的用户创建错误
}
}
};
setValue(userEntity,completionListener);
回来
}

在我看来,更好的方法是让firebase云功能在用户注册时为您完成这项工作。如果您想在不必在客户端上执行的情况下将实际用户配置文件移动到数据库中,请签出。它会将所有这些功能推送到firebase服务器上为您执行

通常情况下,您会将其存储在SharedReference上,以存储用户详细信息,如firebaseToken、userId、firstname..等