【问题标题】:Firebase .getUID NullPointerException when authen身份验证时的Firebase .getUID NullPointerException
【发布时间】:2017-08-01 21:56:57
【问题描述】:

我会在注册时将数据添加到数据库中,但我得到了

Java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法“java.lang.String com.google.firebase.auth.FirebaseUser.getUid()”

我尝试了一些东西,但没有用

这是我的代码

    auth = FirebaseAuth.getInstance();

    database = FirebaseDatabase.getInstance();

    mRef = database.getReference();
    FirebaseUser user = auth.getCurrentUser();
    userID = user.getUid();
btnSignUp.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            final String fname = etFname.getText().toString().trim();
            final String lname = etLname.getText().toString().trim();
            final String id_card = etIdCard.getText().toString().trim();
            final String email = etEmail.getText().toString().trim();
            final String mobile = etMobile.getText().toString().trim();
            String password = etPassword.getText().toString().trim();

            if (TextUtils.isEmpty(email)){
                Toast.makeText(getApplicationContext(), "Enter email address!", Toast.LENGTH_SHORT).show();
                return;
            }

            if (TextUtils.isEmpty(password)){
                Toast.makeText(getApplicationContext(), "Enter password!", Toast.LENGTH_SHORT).show();
                return;
            }

            if (TextUtils.isEmpty(fname)){
                Toast.makeText(getApplicationContext(), "Enter FirstName!", Toast.LENGTH_SHORT).show();
                return;
            }

            if (password.length() < 8) {
                Toast.makeText(getApplicationContext(), "Password too short, enter minimum 8 characters!", Toast.LENGTH_SHORT).show();
                return;
            }

            progressBar.setVisibility(View.VISIBLE);

            auth.createUserWithEmailAndPassword(email,password)
                    .addOnCompleteListener(new OnCompleteListener<AuthResult>() {
                        @Override
                        public void onComplete(@NonNull Task<AuthResult> task) {


                            if (!task.isSuccessful()) {

                                UserInfo userInfo = new UserInfo(fname,lname,id_card,mobile,email);
                                mRef.child("users").child(userID).setValue(userInfo);
                                etFname.setText("");
                                etLname.setText("");
                                etIdCard.setText("");
                                etMobile.setText("");
                                etEmail.setText("");
                                Toast.makeText(RegisterActivity.this, "Authentication failed." + task.getException(),
                                        Toast.LENGTH_SHORT).show();

                            } else {
                                Toast.makeText(RegisterActivity.this, "Register Successfully" + task.isSuccessful(), Toast.LENGTH_SHORT).show();
                                progressBar.setVisibility(View.GONE);

                                finish();
                            }

                        }
                    });
        }
    });


}

现在得到这样的新错误 java.lang.NoSuchMethodError:Lcom/google/firebase/FirebaseApp 类中没有虚拟方法 zzTt()Z;或其超类(“com.google.firebase.FirebaseApp”的声明出现在 /data/app/com.example.androiddev.army31-1/split_lib_dependencies_apk.apk:classes36.dex 中)

现在我可以修复它,因为在 gradle 上编译的版本不同

得到了同样的东西

【问题讨论】:

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


    【解决方案1】:

    您在代码中提到的身份验证类型是什么,将其替换为单行并检查它是否有效

            String mUid = FirebaseAuth.getInstance().getCurrentUser().getUid();
    

    您还可以查看文档以获取完整的工作代码示例:https://firebase.google.com/docs/auth/android/manage-users

    【讨论】:

    • 感谢您的回复,抱歉,如何使用您的代码?我不确定
    • 单班轮和他做的有什么区别?没有,这是基本的java
    • 完整的Java工作代码请参考文档-@C.Junior
    【解决方案2】:

    检查一下:

    if(auth.getCurrentUser() != null){
        uid = auth.getCurrentUser().getUID();
    }
    

    【讨论】:

    • 感谢回复,但它不起作用我更新我的代码请参阅
    【解决方案3】:
     FirebaseUser user = auth.getCurrentUser();
     userID = user.getUid();
    

    要运行以上两行,您必须(我强调您必须)在 Firebase 中具有基于 用户名/密码 的身份验证。它正在抛出NullPointerException,因为大多数新手程序员忘记在 Firebase 控制台中设置基于用户的身份验证。

    您可以在 Firebase 身份验证中添加用户。

    如果您使用的是 Firebase 实时数据库,那么我建议您在 RULES 选项卡中添加以下规则。

    // These rules grant access to a node matching the authenticated
    // user's ID from the Firebase auth token
    {
      "rules": {
        "users": {
          "$user_id": {
            ".read": "$user_id === auth.uid",
            ".write": "$user_id === auth.uid"
          }
        }
      }
    

    }

    【讨论】:

    • 感谢回复,但我是 ser { "rules": { ".read": true, ".write": true } }
    • 看我更新的答案,我说的是身份验证,你可以忘记规则。
    • 好的,我得到了改变,但有新问题 split_lib_dependencies_apk.apk:classes36.dex)
    • 你能告诉我你的 RegistryActivity 的第 42 行吗?有一个错误。错误发生在链中。我们解决了第一个错误,然后是第二个,然后是第三个,依此类推。所以,我假设这是你的第一个错误。
    猜你喜欢
    • 2017-09-11
    • 1970-01-01
    • 2020-04-01
    • 2022-12-10
    • 1970-01-01
    • 2019-03-23
    • 2019-04-21
    • 1970-01-01
    相关资源
    最近更新 更多