我正在制作一个聊天应用程序,我想执行以下操作:
启动MainActivity时,请检查用户是否已登录。否则,请启动FirebaseAuthUI。
但是FirebaseAuth仅支持几个参数,并且要添加更多参数,我为每个用户创建了一个Database节点,该节点存储其他参数。 为了获得此参数,在完成FirebaseAuth之后,将用户重定向到“活动”,该活动将获取所有额外信息并存储在数据库的用户节点中。所有这些都很好。
但是,在用户在此Info Activity中填写信息并完成注册后,它应返回MainActivity并停留在此。我该怎么办?
我正在尝试这种方式:
我向每个用户添加了一个名为userCompleted
的布尔变量,该变量通知用户是否已经提供了他们的信息。我检查此变量是否为false,如果是,则调用Info Activity意图,当用户按下按钮以完成此Activity中的注册时,它将userCompleted
的值设置为{{1} },然后启动一个指向MainActivity的意图。
问题在于,在数据库中,true
设置为userCompleted
,然后立即返回到true
,但我不知道为什么。另外,我想我在从数据库中读取false
时遇到了麻烦,这可能是因为我在异步任务方面工作不多。
我使用了Main Activity中声明的变量userCompleted
来跟踪userCompleted值。
一种检查用户是否是首次登录的方法也很有用,尽管它不能解决我的全部问题。
这是我当前的代码:
(如果需要更多尝试来理解问题,只需在评论中提问)
创建AuthStateListener
isUserCompleted
onSignInInitialize()
public void setAuthStateListener(){
mAuthStateListener = new FirebaseAuth.AuthStateListener() {
@Override
public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) {
FirebaseUser user = firebaseAuth.getCurrentUser();
if (user != null) {
onSignInInitialize(user);
Log.d(TAG, "userUid = " + user.getUid());
Toast.makeText(SearchActivity.this, "Signed in!", Toast.LENGTH_SHORT).show();
} else {
onSignOutCleanup();
startLoginUI();
}
}
};
}
返回到主要活动
public void onSignInInitialize(final FirebaseUser user){
mLoggedFBUser = user;
mUserReference = mUsersDatabaseReference.child(user.getUid());
mUserReference.child("uid").setValue(user.getUid());
mUserReference.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
User user = dataSnapshot.getValue(User.class);
isUserCompleted = user.isUserCompleted();
Log.d(TAG, "UserCompleted (onDataChanged) "+ isUserCompleted);
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
Log.d(TAG, "UserCompleted (Before startActivity if) "+ isUserCompleted);
if (!isUserCompleted) {
startCreateProfileActivity(user);
}
Log.d(TAG, "UserCompleted (After startActivity if) "+ isUserCompleted);
mUserReference.child("username").setValue(user.getDisplayName());
mUserReference.child("email").setValue(user.getEmail());
attachChildEventListener();
}
整个MainActivity块(实际上称为mFinishButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mUserDatabaseReference.child("userCompleted").setValue(true);
Intent intent = new Intent (CreateVolunteerProfile.this, SearchActivity.class);
startActivity(intent);
}
});
)
SearchActivity
}
答案 0 :(得分:0)
我认为最简单的方法是,如果用户单击完成Btn,则成功将其标记为true,否则将其标记为
在您的MainActivity
firebase.auth().onAuthStateChanged(function(user) {
// User signed in and not registered
if (user&&!isPressedOnFinishBtn) {
// User is signed in.
}
user clicked on finish btn
else if(isPressedOnFinishBtn) {
// No user is signed in.
}
});
答案 1 :(得分:0)
这就是您可以执行的操作。 在您的Login活动中创建一个方法。
private void AllowUserToLogin() {
String userName = userEmail.getText().toString();
String userPass = userPassword.getText().toString();
if (TextUtils.isEmpty(userName) || TextUtils.isEmpty(userPass)) {
Toast.makeText(this, "Enter user Name / password first . . .", Toast.LENGTH_SHORT).show();
} else {
dialogBar.setTitle("Sign In ");
dialogBar.setMessage("Please Wait . . .");
dialogBar.setCanceledOnTouchOutside(true);
dialogBar.show();
mAuth.signInWithEmailAndPassword(userName, userPass)
.addOnCompleteListener(new OnCompleteListener<AuthResult>() {
@Override
public void onComplete(@NonNull Task<AuthResult> task) {
if (task.isSuccessful()) {
String currentUserID = mAuth.getCurrentUser().getUid();
String deviceToken = Settings.Secure.getString(getApplicationContext().getContentResolver(),
Settings.Secure.ANDROID_ID);
UsersRef.child(currentUserID).child("device_token")
.setValue(deviceToken)
.addOnCompleteListener(new OnCompleteListener<Void>() {
@Override
public void onComplete(@NonNull Task<Void> task) {
if(task.isSuccessful()){
sendUserToMainActivity();
Toast.makeText(LoginPage.this, "Logged in Successfull . . . ", Toast.LENGTH_SHORT).show();
dialogBar.dismiss();
}
}
});
} else {
String error = task.getException().toString();
Toast.makeText(LoginPage.this, "Wrong Email or Password: " + error, Toast.LENGTH_SHORT).show();
dialogBar.dismiss();
}
}
});
}
}
以及ur onClick()方法上。
@Override
public void onClick(View v) {
if (v == needNewAccount) {
sendUserToRegisterActivity();
} else if (v == loginButton) {
AllowUserToLogin();
}else if(v == phone_button){
Intent phoneLoginIntent = new Intent(LoginPage.this , PhoneLoginActivity.class);
startActivity(phoneLoginIntent);
}
}
这是sendUserToRegisterActivity()
private void sendUserToRegisterActivity() {
Intent registerIntent = new Intent(LoginPage.this, RegisterationForm.class);
startActivity(registerIntent);
}
这是sendUserToMainActivity()。
private void sendUserToMainActivity() {
Intent mainIntent = new Intent(LoginPage.this, MainActivity.class);
mainIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(mainIntent);
finish();
}