Reputation: 21
Problem This is the code for register activity and i want to make user register and also add user name and user id details in realtimedatabase. But app gets crashed after opening register activity
Error FATAL EXCEPTION: main Process: com.example.movies4u, PID: 27945 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)
java
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).addOnCompleteListener(task -> {
if(task.isSuccessful()){
userID=mAuth.getCurrentUser().getUid();
// firebaseMethods.registerNewEmail(username,email,password);
setupFirebaseAuth();
sendVerificationEmail();
}
}).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.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();
}
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();
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.addListenerForSingleValueEvent(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);
}
}
}
Upvotes: 1
Views: 269
Reputation: 413
Not sure, but try to replace this
if (task.isSuccessful()) {
to that
if(task != null && task.isSuccessful()){
(everywhere).
Task is nullable, and can return null (Google doesn't say this in the docs.
Also add the same check for user
if (mAuth.getCurrentUser() != null)
It could be null if user not signed in, and throw NullPointerEx when you try to call
getUid()
Upvotes: 0