问题
I have run into a problem, where there are no errors, both in the logs and the android monitor.
However when I click login it doesn't work nothing happens at all.
By the way I'm making an app that uses firebase database, and I'm on the Login and Dispalying User Details part.
Perhaps something is wrong with my Login? or in my display? Here's my code:
Login:
package com.loginpack;
import...
public class LoginActivity extends AppCompatActivity {
//VIEW AND WIDGETS
Button loginBtn;
EditText userEmailEdit, userPasswordEdit;
//STRING FIELDS
String userEmailString, userPasswordString;
//FIREBASE AUTH FIELDS
FirebaseAuth mAuth;
FirebaseAuth.AuthStateListener nAuthlistener;
DatabaseReference mDatabaseRef;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
//ASSIGN IDS
loginBtn = (Button) findViewById(R.id.loginBtn);
userEmailEdit = (EditText) findViewById(R.id.loginEditText);
userPasswordEdit = (EditText) findViewById(R.id.loginPasswordEditText);
//ASSIGN INSTANCE
//Changed here
mDatabaseRef = FirebaseDatabase.getInstance().getReference().child("Users");
mAuth = FirebaseAuth.getInstance();
nAuthlistener = new FirebaseAuth.AuthStateListener(){
@Override
public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) {
FirebaseUser User = firebaseAuth.getCurrentUser();
if (User != null){
final String emailForVer = User.getEmail();
mDatabaseRef.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
checkUserValidation(dataSnapshot,emailForVer);
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
}else{
}
}
};
//ONCLICK LISTENER
loginBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//Perform Login Operation
userEmailString = userEmailEdit.getText().toString().trim();
userPasswordString = userPasswordEdit.getText().toString().trim();
if(!TextUtils.isEmpty(userEmailString) && !TextUtils.isEmpty(userPasswordString) && userPasswordString != null && userEmailString != null)
{
mAuth.signInWithEmailAndPassword(userEmailString, userPasswordString).addOnCompleteListener(new OnCompleteListener<AuthResult>() {
@Override
public void onComplete(@NonNull Task<AuthResult> task) {
if (task.isSuccessful())
{
mDatabaseRef.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
checkUserValidation(dataSnapshot, userEmailString);
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
}else
{
Toast.makeText(LoginActivity.this, "User Login Failed", Toast.LENGTH_LONG).show();
Toast.makeText(LoginActivity.this, task.getException().getMessage(), Toast.LENGTH_LONG).show();
}
}
});
}
}
});
}
private void checkUserValidation(DataSnapshot dataSnapshot, String emailForVer) {
Iterator iterator = dataSnapshot.getChildren().iterator();
while(iterator.hasNext())
{
DataSnapshot dataUser = (DataSnapshot) iterator.next();
if(String.valueOf(dataUser.child("emailUser").getValue()).equals(emailForVer) && dataUser.child("emailUser") != null) {
if (String.valueOf(dataUser.child("isVerified").getValue()).equals("unverified") && dataUser.child("isVerified") != null) {
Intent in = new Intent(LoginActivity.this, Profile.class);
in.putExtra("USER_KEY", String.valueOf(dataUser.child("userKey").getValue()));
startActivity(in);
} else {
startActivity(new Intent(LoginActivity.this, Welcome.class));
}
}
}
}
@Override
protected void onStart() {
super.onStart();
mAuth.addAuthStateListener(nAuthlistener);
}
@Override
protected void onStop() {
super.onStop();
mAuth.removeAuthStateListener(nAuthlistener);
}
}
here's where I read the data from my database and diplay it when the user logs in:
public class Welcome extends AppCompatActivity {
private static final String TAG = "ViewDatabase";
//ADD FIREBASE STUFF
//DECLARE FIELDS
Button outBtn;
TextView welcome;
private DatabaseReference myRef;
private FirebaseDatabase mFirebaseDatabase;
private String userID;
private ListView mListView;
//FIREBASE AUTH FIELDS
private FirebaseAuth nAuth;
private FirebaseAuth.AuthStateListener nAuthlistener;
//GET USER KEY FROM INTENT
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_welcome);
//ASSIGN IDS
outBtn = (Button) findViewById(R.id.logoutBtn);
welcome = (TextView) findViewById(R.id.WelcomeName);
mListView = (ListView) findViewById(R.id.listview);
//ASSIGN INSTANCE
myRef = mFirebaseDatabase.getReference().child("Users");
nAuth = FirebaseAuth.getInstance();
FirebaseUser User = nAuth.getCurrentUser();
userID = User.getUid();
nAuthlistener = new FirebaseAuth.AuthStateListener(){
@Override
public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) {
FirebaseUser User = firebaseAuth.getCurrentUser();
if (User != null){
Log.d(TAG, "onAuthStateChanged:signed_in:" + User.getUid());
Toast.makeText(Welcome.this, "Successfully signed in with: " + User.getEmail(), Toast.LENGTH_LONG).show();
}else{
Log.d(TAG, "onAuthStateChanged:signed_out" + User.getUid());
Toast.makeText(Welcome.this, "Successfully signed out.", Toast.LENGTH_LONG).show();
}
}
};
myRef.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
showData(dataSnapshot);
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
/* myRef.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});*/
outBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
nAuth.signOut();
finish();
startActivity(new Intent(Welcome.this, MainActivity.class));
}
});
}
private void showData(DataSnapshot dataSnapshot) {
//Changed here
for(DataSnapshot ds : dataSnapshot.getChildren()){
UserInformation uInfo = new UserInformation();
uInfo.setUserName(ds.child(userID).getValue(UserInformation.class).getUserName());
uInfo.setUserAge(ds.child(userID).getValue(UserInformation.class).getUserAge());
uInfo.setUserBirth(ds.child(userID).getValue(UserInformation.class).getUserBirth());
uInfo.setUserPhone(ds.child(userID).getValue(UserInformation.class).getUserPhone());
uInfo.setUserUserName(ds.child(userID).getValue(UserInformation.class).getUserUserName());
uInfo.setUserUserName(ds.child(userID).getValue(UserInformation.class).getUserUserName());
Log.d(TAG, "showData: snapshot: " + ds);
Log.d(TAG, "showData: snapshot: " + ds.child("Users"));
//display all info taken
Log.d(TAG, "showData: userName: " + uInfo.getUserName());
Log.d(TAG, "showData: userAge: " + uInfo.getUserAge());
Log.d(TAG, "showData: userBirth: " + uInfo.getUserBirth());
Log.d(TAG, "showData: userPhone: " + uInfo.getUserPhone());
Log.d(TAG, "showData: userUserName: " + uInfo.getUserUserName());
ArrayList<String> array = new ArrayList<>();
array.add(uInfo.getUserName());
array.add(uInfo.getUserAge());
array.add(uInfo.getUserBirth());
array.add(uInfo.getUserPhone());
array.add(uInfo.getUserUserName());
ArrayAdapter adapter = new ArrayAdapter<>(this,android.R.layout.simple_list_item_1,array);
mListView.setAdapter(adapter);
}
}
@Override
protected void onStart() {
super.onStart();
nAuth.addAuthStateListener(nAuthlistener);
}
@Override
protected void onStop() {
super.onStop();
nAuth.removeAuthStateListener(nAuthlistener);
}
}
Here's what my database looks like:
Is there anything you can suggest that I do? I already tried a lot of stuff. but still notihng happens when I click the login button. Maybe the welcome activity is taking too long to read the data? or perhaps the Login activity is wrong? Any help is appreciated! Thank you!
回答1:
All You Have to do is First Use Auth for Login then Send Current user Id to Your Firebase Database and check if user exists or not.!
Here is sample code hope this might help you.!
//get User Entered Values from EditText Fields.!
String email=emailEditText.getText().toString().trim();
String password=passwordEditText.getText().toString().trim();
/logging in the user
mAuth.signInWithEmailAndPassword(email, password)
.addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
@Override
public void onComplete(@NonNull Task<AuthResult> task) {
//if the task is successfull
if(task.isSuccessful()){
AddEventFireBaseListner(mAuth.getCurrentUser().getUid(),email, password);
}
private void AddEventFireBaseListner(String uid,String email,String password){
final User user;
mdatabaseReference.child("users").orderByKey().equalTo(uid).addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for (DataSnapshot postsnapshot : dataSnapshot.getChildren()) {
user= postsnapshot.getValue(User.class);
}//end of comments
if(user!=null){
if (user.getemail().equalsIgnoreCase(email) && user.getpassword().equalsIgnoreCase(password)) {
Intent intent = new Intent(getApplicationContext(), MainActivity.class);
//Parcalable object
intent.putExtra("userObj",user);
startActivity(intent);
}
}
}
else{
Snackbar snackbar = Snackbar.make(coordinatorLayout, "Invalid user", Snackbar.LENGTH_LONG).setAction("HIDE", new View.OnClickListener() {
@Override
public void onClick(View view) {
}
});
snackbar.show();
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
});//End
}
and for sending whole `user` object to next activity try to use `Parcelable`
public class User implements Parcelable {
String name;
String email;
public User(String name, String email) {
this.name = name;
this.email = email;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
protected User(Parcel in) {
name = in.readString();
email = in.readString();
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(name);
dest.writeString(email);
}
@Override
public int describeContents() {
return 0;
}
public static final Creator<User> CREATOR = new Creator<User>() {
@Override
public User createFromParcel(Parcel in) {
return new User(in);
}
@Override
public User[] newArray(int size) {
return new User[size];
}
};
@Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
", email='" + email + '\'' +
'}';
}
}
来源:https://stackoverflow.com/questions/46702189/login-and-reading-writing-data-in-android-studio-no-error-but-not-working