我在Android应用程序中使用Firebase身份验证,我使用Google帐户身份验证作为登录该应用程序的选项。
我如何知道用户是否第一次登录该应用程序?
答案 0 :(得分:24)
要检查用户是否第一次登录,只需在AdditionalUserInfo.isNewUser()
回调中调用OnCompleteListener.onComplete
方法。
下面的示例代码,请务必检查是否为空。
OnCompleteListener<AuthResult> completeListener = new OnCompleteListener<AuthResult>() {
@Override
public void onComplete(@NonNull Task<AuthResult> task) {
if (task.isSuccessful()) {
boolean isNew = task.getResult().getAdditionalUserInfo().isNewUser();
Log.d("MyTAG", "onComplete: " + (isNew ? "new user" : "old user"));
}
}
};
查看文档以获取更多参考{{3}}
答案 1 :(得分:5)
从Firebase-ui docs,您可以检查创建时间戳的最后登录时间戳,如下所示:
FirebaseUserMetadata metadata = auth.getCurrentUser().getMetadata();
if (metadata.getCreationTimestamp() == metadata.getLastSignInTimestamp()) {
// The user is new, show them a fancy intro screen!
} else {
// This is an existing user, show them a welcome back screen.
}
答案 2 :(得分:4)
根据新版本的 Firebase身份验证(16.0.1),AuthResult类具有一个成员函数,其结果为true或false(如果用户是新用户)。 假设在范围(它是google凭据)中定义了“凭据” 。一个例子如下所示: `
private FirebaseAuth mAuth;
GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
.requestIdToken(getString(R.string.default_web_client_id))
.requestEmail()
.build();
mAuth = FirebaseAuth.getInstance();
Task<GoogleSignInAccount> task = GoogleSignIn.getSignedInAccountFromIntent(data);
GoogleSignInAccount acct = task.getResult(ApiException.class);
AuthCredential credential = GoogleAuthProvider.getCredential(acct.getIdToken(), null);
mAuth.signInWithCredential(credential)
.addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
@Override
public void onComplete(@NonNull Task<AuthResult> task) {
if (task.isSuccessful()) {
Log.d(TAG, "linkWithCredential:success");
boolean newuser = task.getResult().getAdditionalUserInfo().isNewUser();
if(newuser){
//Do Stuffs for new user
}else{
//Continue with Sign up
}
} else {
Toast.makeText(MyClass.this, "Authentication failed.",
Toast.LENGTH_SHORT).show();
}
});
感谢firebase:)
答案 3 :(得分:2)
从版本11.6.0开始,我们可以使用AdditionalUserInfo.isNewUser()
https://firebase.google.com/docs/reference/android/com/google/firebase/auth/AdditionalUserInfo
答案 4 :(得分:1)
将Firebase Auth与Firestore一起使用时的解决方案
使用Firebase身份验证currentUser.uid
为每个用户创建根文档。首先在第一次创建用户时向根文档添加一个名为registered_at
的字段,然后根据您的用例将您的特定集合添加到根文档中。
登录或登录时,您可以检查具有registered_at
字段的文档是否已存在。如果它还不存在,那么您可以将用户视为新用户(假设用户以后无法删除或更改registered_at
字段)
import com.google.firebase.auth.FirebaseAuth
import com.google.firebase.firestore.DocumentReference
import com.google.firebase.firestore.FirebaseFirestore
fun rootDocument(): DocumentReference? = rootPath()?.let {
return fireStore().document(it)
}
fun rootPath(): String? {
val loggedInUser = loggedInUser()
if (loggedInUser != null) {
return "users/${loggedInUser.uid}"
}
return null
}
fun fireStore() = FirebaseFirestore.getInstance()
fun createWriteBatch() = fireStore().batch()
fun loggedInUser() = fireAuth().currentUser
fun fireAuth(): FirebaseAuth = FirebaseAuth.getInstance()
fun afterSignIn() {
val rootDocument = rootDocument()
?: throw IllegalStateException("root document not found")
rootDocument.get().addOnCompleteListener {
val isNewUser = it.result.exists().not()
if (isNewUser) {
val batch = createWriteBatch()
batch.set(rootDocument, HashMap<Any, Any>().apply {
put("registered_at", System.currentTimeMillis())
})
batch.commit().addOnCompleteListener {
println("this is a new user")
}
} else {
println("this is not a new user")
}
}
}
答案 5 :(得分:0)
答案 6 :(得分:0)
虽然我完全同意最正确的方法(鉴于无法在auth用户表中添加新字段)是为用户创建新路径并在那里存储信息,但我并不想做额外的登录后请求执行此检查(我使用Firestore和请求=金钱)。
我需要先进行首次登录检查以提示输入userName(因为显示名称是从Facebook / Google中提取的,我想在第一次登录时提供覆盖选项)。我最终做的是使用photoURL属性作为标志来确定它是否是他们的第一次。它并不理想,但也许有人想要节省请求可以使用它作为一种解决方法。对于Firebase来说,这不是什么大不了的事,但对于Firestore来说,它对你的计划来说成本更高
答案 7 :(得分:0)
在Firebase UI中,JAVA:
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
Intent i;
if (requestCode == RC_SIGN_IN) {
IdpResponse response = IdpResponse.fromResultIntent(data);
if (resultCode == RESULT_OK) {
if(response.isNewUser()){
Log.d(TAG, "onActivityResult: isNewUser "+response.isNewUser());
} else {
// Successfully signed in
}
// ...
} else {
// handle error
}
}
}
答案 8 :(得分:0)
首先检查 - 如果当前用户 uid 与您的文档 ID 匹配,则为旧用户,否则为新用户
<块引用>示例
private boolean isUserMatch(String currentUserId) {
firestore.collection(COLLECTION_USER).get().addOnCompleteListener(new OnCompleteListener< QuerySnapshot >() {
@Override
public void onComplete(@NonNull @NotNull Task< QuerySnapshot > task) {
if (task.isSuccessful()) {
for (QueryDocumentSnapshot documentSnapshot : task.getResult()) {
if (currentUserId.equals(documentSnapshot.getId())) {
return;
}
}
}
}
}).addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull @NotNull Exception e) {
Log.e(TAG, "onFailure: ", e.getCause());
}
});
return false;
}