我的应用程序中有几种注册方法,如下所示:
让我们围绕 Google登录方法解决问题:
我正在做的是,当用户登录enteringDataIntoUserNode()
方法时,会在signInWithCredential()
方法内部调用,例如:
private void firebaseAuthWithGoogle(GoogleSignInAccount acct) {
AuthCredential credential =
GoogleAuthProvider.getCredential(acct.getIdToken(), null);
// signing in
mAuth.signInWithCredential(credential)
.addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
@Override
public void onComplete(@NonNull Task<AuthResult> task) {
if (task.isSuccessful()) {
// entering default values in the database
enteringDataIntoUserNode();
Intent intent = new Intent(LoginAndSignupActivity.this, MainActivity.class);
startActivity(intent);
finish();
}
else {
Log.w(TAG, "signInWithCredential:failure", task.getException());
}
}
});
}
enteringDataIntoUserNode()
private void enteringDataIntoUserNode() {
final String currentUid = mAuth.getCurrentUser().getUid();
//
String deviceToken = FirebaseInstanceId.getInstance().getToken();
final String userName = mAuth.getCurrentUser().getDisplayName();
String imageUrl = mAuth.getCurrentUser().getPhotoUrl().toString();
String userStatus = "Hi there! How is it going?";
// inserting data in key-value pair
usersReference.child(currentUid).child("user_name").setValue(userName);
usersReference.child(currentUid).child("user_status").setValue(userStatus);
usersReference.child(currentUid).child("user_image").setValue(imageUrl);
usersReference.child(currentUid).child("device_token").setValue(deviceToken);
// when this last value will be inserted then, making an intent to MainActivity
usersReference.child(currentUid).child("user_thumb_image").setValue(imageUrl)
.addOnCompleteListener(new OnCompleteListener<Void>() {
@Override
public void onComplete(@NonNull Task<Void> task) {
if(task.isSuccessful()){
Log.d(TAG, "onComplete: Data insertion for the new user is successful ");
}
}
});
}
enteringDataIntoUserNode()方法只是在每次用户登录时将一些默认数据传递到数据库。但是,如果用户更改了其详细信息(例如图像或用户名等)并退出并再次登录通过 Google登录方法,然后再次调用 enteringDataIntoUserNode()方法,并且默认用户名将覆盖用户详细信息。
我的问题是,有什么方法可以检查用户是否在 Google登录期间是第一次登录,这样在后一种情况下,我可以跳过呼叫 enterDataIntoUserNode()方法,并防止数据被覆盖。 在 Facebook 和电话号码登录期间,我也想实现相同的目的。
答案 0 :(得分:1)
如果您检查用户是否为首次登录,则要检查用户是否为新用户也是如此。因此,要解决此问题,我们可以像这样在isNewUser()
回调中简单地调用OnCompleteListener.onComplete
方法:
OnCompleteListener<AuthResult> completeListener = new OnCompleteListener<AuthResult>() {
@Override
public void onComplete(@NonNull Task<AuthResult> task) {
if (task.isSuccessful()) {
boolean isNewUser = task.getResult().getAdditionalUserInfo().isNewUser();
if (isNewUser) {
Log.d("TAG", "The user is new!");
} else {
Log.d("TAG", "The user is not new!");
}
}
}
};
有关更多信息,请参见official documentation。
答案 1 :(得分:0)
您可以使用以下方法检查帐户的创建时间:
task.getResult().getUser().getMetadata().getCreationTimestamp()
请参见reference docs。
但是一种常见的方法也是检查用户是否已经存在于数据库using a transaction中。