問題 這是注冊活動的代碼,我想讓用戶注冊并在實時資料庫中添加用戶名和用戶 ID 詳細資訊。但是打開注冊活動后應用程式崩潰了
錯誤
FATAL EXCEPTION: main
Process: com.example.movies4u, PID: 18933
java.lang.NullPointerException: Attempt to invoke interface method 'void com.google.firebase.auth.FirebaseAuth$AuthStateListener.onAuthStateChanged(com.google.firebase.auth.FirebaseAuth)' on a null object reference
at com.google.firebase.auth.zzl.run(com.google.firebase:firebase-auth@@21.0.3:1)
at android.os.Handler.handleCallback(Handler.java:873)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:224)
at android.app.ActivityThread.main(ActivityThread.java:7081)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:604)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:928)
爪哇
package com.example.movies4u;
import static android.content.ContentValues.TAG;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import android.annotation.SuppressLint;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.WindowManager;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ProgressBar;
import android.widget.TextView;
import android.widget.Toast;
import com.example.movies4u.Utils.FirebaseMethods;
import com.google.android.gms.tasks.OnCompleteListener;
import com.google.android.gms.tasks.OnFailureListener;
import com.google.android.gms.tasks.Task;
import com.google.firebase.auth.AuthResult;
import com.google.firebase.auth.FirebaseAuth;
import com.google.firebase.auth.FirebaseAuthUserCollisionException;
import com.google.firebase.auth.FirebaseUser;
import com.google.firebase.database.DataSnapshot;
import com.google.firebase.database.DatabaseError;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import com.google.firebase.database.ValueEventListener;
public class activity_register extends AppCompatActivity {
TextView HaveAccount;
EditText inputUsername,inputEmail,inputPassword,inputConfirmPassword;
String username,email,password;
Button btnRegister;
FirebaseAuth mAuth;
ProgressBar pb;
private String userID;
private FirebaseAuth.AuthStateListener mAuthListener;
private FirebaseMethods firebaseMethods;
private FirebaseDatabase mFirebaseDatabase;
private DatabaseReference myRef;
private String append;
@SuppressLint("MissingInflatedId")
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN); //Hide status Bar
setContentView(R.layout.activity_register);
firebaseMethods =new FirebaseMethods(activity_register.this);
HaveAccount= (TextView) findViewById(R.id.HaveAccount);
pb = findViewById(R.id.progressBar3);
inputUsername=findViewById(R.id.inputUsername);
inputEmail=findViewById(R.id.inputEmail);
inputPassword=findViewById(R.id.inputPassword);
inputConfirmPassword=findViewById(R.id.inputConfirmPassword);
btnRegister=findViewById(R.id.btnRegister);
username=inputUsername.getText().toString();
email=inputEmail.getText().toString();
password=inputPassword.getText().toString();
pb.setVisibility(View.GONE);
HaveAccount.setOnClickListener(view -> {
Intent loginintent=new Intent(activity_register.this,login_activity.class);
startActivity(loginintent);
});
mAuth=FirebaseAuth.getInstance();
btnRegister.setOnClickListener(view -> ValidateDataandDoRegister());
}
private void ValidateDataandDoRegister() {
String username=inputUsername.getText().toString().trim();
String email=inputEmail.getText().toString().trim();
String password=inputPassword.getText().toString().trim();
String confirmPassword=inputConfirmPassword.getText().toString().trim();
if(email.isEmpty()){
inputEmail.setError("Enter Email Address");
inputEmail.requestFocus();
pb.setVisibility(View.GONE);
}
else if(email.length()<10){
inputEmail.setError("Enter valid Email");
inputEmail.requestFocus();
pb.setVisibility(View.GONE);
}
else if(password.isEmpty()){
inputPassword.setError("Enter the password");
inputPassword.requestFocus();
pb.setVisibility(View.GONE);
}
else if(password.length()<8){
inputPassword.setError("Password should be greater than 8 characters");
inputPassword.requestFocus();
pb.setVisibility(View.GONE);
}
else if(confirmPassword.isEmpty()){
inputConfirmPassword.setError("Re-Enter the Password");
inputConfirmPassword.requestFocus();
pb.setVisibility(View.GONE);
}
else if(confirmPassword.length()<8){
inputConfirmPassword.setError("Password should be greater than 8 characters");
inputConfirmPassword.requestFocus();
pb.setVisibility(View.GONE);
}
else if(!password.equals(confirmPassword)){
inputPassword.setError("Password not matched");
inputPassword.requestFocus();
inputConfirmPassword.setError("Password not matched");
inputConfirmPassword.requestFocus();
inputPassword.setText("");
inputConfirmPassword.setText("");
pb.setVisibility(View.GONE);
}
else{
pb.setVisibility(View.VISIBLE);
doRegister(username,email,password);
}
}
private void doRegister(String username,String email, String password) {
pb.setVisibility(View.VISIBLE);
mAuth.createUserWithEmailAndPassword(email, password).addOnSuccessListener(task -> {
if(task != null ){
if(mAuth.getCurrentUser() != null){
userID=mAuth.getCurrentUser().getUid();
}
// firebaseMethods.registerNewEmail(username,email,password);
setupFirebaseAuth();
sendVerificationEmail();
// firebaseMethods.addNewUser(email, username);
}
}).addOnFailureListener(e -> {
if(e instanceof FirebaseAuthUserCollisionException){
btnRegister.setEnabled(true);
inputEmail.setError("Email Already Registered");
pb.setVisibility(View.GONE);
inputEmail.requestFocus();
}
else{
btnRegister.setEnabled(true);
pb.setVisibility(View.GONE);
Toast.makeText(activity_register.this, "Oops! Something Went wrong", Toast.LENGTH_SHORT).show();
}
});
}
private void sendVerificationEmail() {
mAuth.getCurrentUser().sendEmailVerification().addOnCompleteListener(task -> {
if(task != null && task.isSuccessful()){
btnRegister.setEnabled(true);
pb.setVisibility(View.GONE);
Toast.makeText(activity_register.this, "Email has been sent to your email address", Toast.LENGTH_SHORT).show();
//fixing the bug
mAuth.signOut();
}
else {
btnRegister.setEnabled(true);
pb.setVisibility(View.GONE);
Toast.makeText(getApplicationContext(), "Oops! failed to send verification email",Toast.LENGTH_SHORT).show();
}
});
}
/*
------------------------------------ Firebase ---------------------------------------------
*/
/**
* Setup the firebase auth object
*/
private void setupFirebaseAuth(){
Log.d(TAG, "setupFirebaseAuth: setting up firebase auth.");
mAuth = FirebaseAuth.getInstance();
mFirebaseDatabase = FirebaseDatabase.getInstance();
myRef = mFirebaseDatabase.getReference();
//cannot get into this part of code
mAuthListener = new FirebaseAuth.AuthStateListener() {
@Override
public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) {
FirebaseUser user=firebaseAuth.getCurrentUser();
if (user != null) {
// User is signed in
Log.d(TAG, "onAuthStateChanged:signed_in:" user.getUid());
myRef.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
//1st check: Make sure the username is not already in use
if(firebaseMethods.checkIfUsernameExists(username, dataSnapshot)){
//to randomly generate key to make sure username is unique
append = myRef.push().getKey().substring(3,10);
Log.d(TAG, "onDataChange: username already exists. Appending random string to name: " append);
}
username = username append;
//add new user to the database
// firebaseMethods.addNewUser(email, username);
Toast.makeText(activity_register.this, "SignUp successful", Toast.LENGTH_SHORT).show();
}
@Override
public void onCancelled(DatabaseError databaseError) {
Toast.makeText(activity_register.this, "unsuccessful", Toast.LENGTH_SHORT).show();
}
});
finish();
} else {
// User is signed out
Toast.makeText(activity_register.this, "unsuccessful", Toast.LENGTH_SHORT).show();
Log.d(TAG, "onAuthStateChanged:signed _out");
}
// ...
}
};
}
@Override
public void onStart() {
super.onStart();
mAuth.addAuthStateListener(mAuthListener);
}
@Override
public void onStop() {
super.onStop();
if (mAuthListener != null) {
mAuth.removeAuthStateListener(mAuthListener);
}
}
}
我期望將用戶資料存盤在實時資料庫中。但是在我進入注冊活動后,我得到了一個空指標例外。我想這是因為空用戶。但是我應該得到一個非空用戶,因為在用戶單擊注冊按鈕并驗證所有欄位之后,我正在實作該方法。
uj5u.com熱心網友回復:
您的代碼流程是錯誤的。您將 AuthListener 添加到onStart()
asmAuth.addAuthStateListener(mAuthListener);
但mAuthListener
稍后在 中對其進行初始化doRegiter()
,這意味著在將其添加到時onStart()
,它沒有被初始化并且 null 會給出錯誤Null Pointer Exception
。
對于解決方案,您應該在將其添加到 as 之前呼叫setUpFirebaseAuth
該onStart
函式mAuth
:
@Override
public void onStart() {
super.onStart();
setupFirebaseAuth();
mAuth.addAuthStateListener(mAuthListener);
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/522384.html
標籤:Google Cloud Collective 爪哇安卓火力基地firebase-实时数据库firebase 身份验证