UserId返回null

时间:2020-03-05 17:22:06

标签: android firebase firebase-realtime-database firebase-authentication

我的应用返回的UID为空。注册时,我正在使用电话身份验证进行注册,并从用户那里获取一些自定义字段,并将其保存在Firebase数据库中的当前用户UID下。在注册活动中,它为我提供了完美的UID,但是当我通过凭据登录用户并成功登录后,它会将用户转移到MainActivity,在那时,我为空。

注意

我通过匹配我/她在注册时保存的数据库中的用户名和密码来登录用户。这是我没有使用任何 Firebase登录方法的UID的问题吗?而是在登录活动中匹配数据库中的值,并在成功匹配后登录用户。因为如果还有其他问题,它也不会在 Register Activity 上给我UID,但是登录后,它在 Main Activity Profile Activity上给我null。

登录代码

FirebaseDatabase.getInstance().getReference().child("Content").child("Profiles").orderByChild("mobile_number").equalTo(mobileNum)
    .addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
            if (dataSnapshot.exists()) {
                for (DataSnapshot user : dataSnapshot.getChildren()) {
                    Profiles profiles = user.getValue(Profiles.class);
                    if (profiles.getPassword().equals(password)) {
                        progressDialog.dismiss();
                        startActivity(new Intent(LoginActivity.this, MainActivity.class));
                    }
                    else {
                        progressDialog.dismiss();
                        HelperClass.showSnakbarMsg(rootView, "Username or password did not match. Please try again.");
                    }
                }
            }

代码不起作用

FirebaseAuth firebaseAuth = FirebaseAuth.getInstance();
String userId = firebaseAuth.getUid();
Log.d("user",userId);

登录后在“主要活动”中返回空值。

如果我通过匹配Firebase实时数据库中的值登录,我是否获得用户的UID或获取UID?必须使用某些Firebase身份验证进行登录(例如电子邮件/密码或电话身份验证或Gmail登录等)。

1 个答案:

答案 0 :(得分:0)

经过大量调试并查看了Firebase文档之后,我得出以下结论:要获得用户UID,必须使用任何Firebase身份验证方法登录。我得到的是空值,因为我正在匹配Firebase数据库中的值,如果它们匹配,我将用户登录。

在所有过程中,Firebase都不了解我是谁。因为我只使用数据库,而不使用电子邮件,密码等正式登录方法,所以这就是我得到空UID的原因。

至于注册,我正在使用Phoneauthentication在自动验证后验证号码。当我使用Firebase进行身份验证时,Firebase会为我提供该用户的UID,因此在那时,它会将我识别为用户,并为我分配一个唯一的编号,该编号是我在注册时使用Firebase身份验证保存的自定义数据的父节点

然后在登录时,在匹配用户凭据的同时,我可以通过此代码将该UID用作其值的父节点,并且可以通过将其保存在共享首选项中或在活动之间传递意图来在任何地方使用它。 / p>

FirebaseDatabase.getInstance().getReference().child("Content").child("Profiles").orderByChild("mobile_number").equalTo(mobileNum)
    .addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
            if (dataSnapshot.exists()) {
                for (DataSnapshot user : dataSnapshot.getChildren()) {
                    ** String key = user.getKey(); **
                    Toast.makeText(LoginActivity.this, key, Toast.LENGTH_SHORT).show();
                    Profiles profiles = user.getValue(Profiles.class);
                    if (profiles.getPassword().equals(password)) {
                        progressDialog.dismiss();
                        startActivity(new Intent(LoginActivity.this, MainActivity.class));
                    }