I am trying to add user to the real-time database in Firebase using their auth UID
as the child node.
I have been using this question as a guide:
The users get added when I run the project in debug mode. The app crashes however when I run it normally. The error I am getting is a null pointer exception.
Here is my code:
public class RegisterUser extends AppCompatActivity {
private static final String TAG = "RegisterUser";
private FirebaseAuth mAuth;
private FirebaseAuth.AuthStateListener mAuthListener;
private FirebaseUser fbUser =null;
private DatabaseReference mFirebaseDatabase;
User user;
private EditText mEmail, mPassword;
private RadioButton rManager, rPlayer;
private Button mRegister;
private ProgressBar mProgressbar;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_register_user);
mEmail = (EditText) findViewById(R.id.email_field);
mPassword = (EditText) findViewById(R.id.password_field);
rManager = (RadioButton) findViewById(R.id.managerBtn);
rPlayer = (RadioButton) findViewById(R.id.playerBtn);
mRegister = (Button) findViewById(R.id.btnSignIn);
mProgressbar = (ProgressBar) findViewById(R.id.progressBar);
mAuth = FirebaseAuth.getInstance();
mRegister.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
String email = mEmail.getText().toString();
String password = mPassword.getText().toString();
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 (password.length() < 6) {
Toast.makeText(getApplicationContext(), "Password too short, enter minimum 6 characters!", Toast.LENGTH_SHORT).show();
return;
}
if (!rManager.isChecked() && !rPlayer.isChecked()) {
Toast.makeText(RegisterUser.this, "You must select either player or manager", Toast.LENGTH_LONG).show();
}
mProgressbar.setVisibility(View.VISIBLE);
String type = "";
//radio buttons
if (rManager.isChecked()) {
type = "Manager";
} else if (rPlayer.isChecked()) {
type = "Player";
}
mFirebaseDatabase = FirebaseDatabase.getInstance().getReference("User");
String userId = mFirebaseDatabase.push().getKey();
User user = new User(email, password, type);
mAuth.createUserWithEmailAndPassword(email, password);
fbUser = FirebaseAuth.getInstance().getCurrentUser();
mFirebaseDatabase.child(fbUser.getUid()).setValue(user);
mProgressbar.setVisibility(View.GONE);
startActivity(new Intent(RegisterUser.this, HomePage.class));
@Override
protected void onResume() {
super.onResume();
mProgressbar.setVisibility(View.GONE);
}
public void onLogIn(View v) {
Intent i = new Intent(this, MainActivity.class);
//i.putExtra(key_1, userName.getText().toString()); //get id for training and display details in full
startActivity(i);
}
}
Error:
01-18 17:01:42.331 3781-3781/com.example.cianm.fyp2018v2 E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.cianm.fyp2018v2, PID: 3781
java.lang.NullPointerException
at com.example.cianm.fyp2018v2.RegisterUser$1.onClick(RegisterUser.java:142)
at android.view.View.performClick(View.java:4463)
at android.view.View$PerformClick.run(View.java:18789)
at android.os.Handler.handleCallback(Handler.java:808)
at android.os.Handler.dispatchMessage(Handler.java:103)
at android.os.Looper.loop(Looper.java:193)
at android.app.ActivityThread.main(ActivityThread.java:5299)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:829)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:645)
at dalvik.system.NativeStart.main(Native Method)
Any help would be greatly appreciated.
By using the onAuthStateChanged
I was able to get the current users UID
and use it as the child node for the User object.
Code:
import android.content.Intent;
import android.support.annotation.NonNull;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.text.TextUtils;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ProgressBar;
import android.widget.RadioButton;
import android.widget.Toast;
import com.example.cianm.testauth.Entity.User;
import com.google.firebase.auth.FirebaseAuth;
import com.google.firebase.auth.FirebaseUser;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
public class RegisterUser extends AppCompatActivity {
private static final String TAG = "MainActivity";
private FirebaseAuth mAuth;
private FirebaseAuth.AuthStateListener mAuthListener;
private DatabaseReference mFirebaseDatabase;
private EditText mEmail, mPassword;
private Button mRegister;
private RadioButton rManager, rPlayer;
private ProgressBar mProgressbar;
User user;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_register_user);
mEmail = (EditText) findViewById(R.id.emailField);
mPassword = (EditText) findViewById(R.id.passwordField);
rManager = (RadioButton) findViewById(R.id.radioManager);
rPlayer = (RadioButton) findViewById(R.id.radioPlayer);
mRegister = (Button) findViewById(R.id.registerBtn);
mProgressbar = (ProgressBar) findViewById(R.id.progressBar);
mAuth = FirebaseAuth.getInstance();
if (mAuth.getCurrentUser() != null) {
startActivity(new Intent(RegisterUser.this, HomePage.class));
}
mAuthListener = new FirebaseAuth.AuthStateListener() {
@Override
public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) {
FirebaseUser fbUser = firebaseAuth.getCurrentUser();
if (fbUser != null) {
// User is signed in
Log.d(TAG, "onAuthStateChanged:signed_in" + fbUser.getUid());
mFirebaseDatabase = FirebaseDatabase.getInstance().getReference("User");
mFirebaseDatabase.child(fbUser.getUid()).setValue(user);
Toast.makeText(getApplicationContext(), "Sucessfully signed in with: " + fbUser.getEmail(), Toast.LENGTH_SHORT).show();
startActivity(new Intent(RegisterUser.this, HomePage.class));
} else {
// User is signed out
Log.d(TAG, "onAuthStateChanged:signed_out");
}
}
};
mRegister.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
String email = mEmail.getText().toString();
String password = mPassword.getText().toString();
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 (password.length() < 6) {
Toast.makeText(getApplicationContext(), "Password too short, enter minimum 6 characters!", Toast.LENGTH_SHORT).show();
return;
}
if (!rManager.isChecked() && !rPlayer.isChecked()) {
Toast.makeText(RegisterUser.this, "You must select either player or manager", Toast.LENGTH_LONG).show();
}
mProgressbar.setVisibility(View.VISIBLE);
String type = "";
//radio buttons
if (rManager.isChecked()) {
type = "Manager";
} else if (rPlayer.isChecked()) {
type = "Player";
}
mProgressbar.setVisibility(View.VISIBLE);
mAuth.createUserWithEmailAndPassword(email, password);
user = new User(email, password, type);
}
});
}
@Override
public void onStart() {
super.onStart();
mAuth.addAuthStateListener(mAuthListener);
}
@Override
public void onStop() {
super.onStop();
if (mAuthListener != null) {
mAuth.removeAuthStateListener(mAuthListener);
}
}
@Override
protected void onResume() {
super.onResume();
mProgressbar.setVisibility(View.GONE);
}
}
After creating user with email and passwoed you need to sign in the user using mAuth.signInWithEmailAndPassword I think your getcurrentuser.getuid() is returning null and thus the null point exception
And also you might wanna
Modify this part-
mFirebaseDatabase = FirebaseDatabase.getInstance().getReference("User");
String userId = mFirebaseDatabase.push().getKey();
User user = new User(email, password, type);
mAuth.createUserWithEmailAndPassword(email, password);
fbUser = FirebaseAuth.getInstance().getCurrentUser();
mFirebaseDatabase.child(fbUser.getUid()).setValue(user);
mProgressbar.setVisibility(View.GONE);
startActivity(new Intent(RegisterUser.this, HomePage.class));
as this
mAuth.createUserWithEmailAndPassword(email,password).addOnSuccessListener(new OnSuccessListener<AuthResult>() {
@Override
public void onSuccess(AuthResult authResult) {
mAuth.signInWithEmailAndPassword(email,password)
fbUser =FirebaseAuth.getInstance().getCurrentUser();
String userId = fbUser.getUid();
mFirebaseDatabase=
FirebaseDatabase.getInstance().getReference("User").child(userId);
mFirebaseDatabase.child("<Key>").setValue("<Value>");
// Go on adding as many user details you want to
mProgressbar.setVisibility(View.GONE);
startActivity(new Intent(RegisterUser.this, HomePage.class));
}
}).addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
// Do something optional
});
Advantage of this approach- This way while retrieving you can simply Look User Node with Child Uid to get the logged in user's detail (without for looping)
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.