Java firebase.auth.FirebaseUser.linkWithCredential引发空指针异常
我应该如何将现有用户帐户与不同的提供商链接,但却是同一封电子邮件? 比如谷歌和FacebookJava firebase.auth.FirebaseUser.linkWithCredential引发空指针异常,java,android,firebase,firebase-authentication,Java,Android,Firebase,Firebase Authentication,我应该如何将现有用户帐户与不同的提供商链接,但却是同一封电子邮件? 比如谷歌和Facebook 如有任何建议,我们将不胜感激。谢谢。mAuth.getCurrentUser()正在返回一个空的FirebaseUser,因为在调用它时没有用户登录。在调用FirebaseUser对象上的方法之前,您的代码应该对此进行检查,如显示的API文档所示。但当我根据我的Logcat单击fbLoginBtn时,它已登录。示例中提到的方法只是通过firebase进行身份验证,在该身份验证过程中,它检测到用户使用相
如有任何建议,我们将不胜感激。谢谢。
mAuth.getCurrentUser()
正在返回一个空的FirebaseUser,因为在调用它时没有用户登录。在调用FirebaseUser对象上的方法之前,您的代码应该对此进行检查,如显示的API文档所示。但当我根据我的Logcat单击fbLoginBtn时,它已登录。示例中提到的方法只是通过firebase进行身份验证,在该身份验证过程中,它检测到用户使用相同的电子邮件退出。那么,如果存在使用相同电子邮件的其他提供程序,我应该如何处理提供程序链接呢?如果您注意到上面的方法handleFacebookAccessToken(),其中调用了onFailure方法。因为同一封电子邮件,但不同的提供商。
public void handleFacebookAccessToken(final AccessToken token, final Activity activity) {
Log.d(TAG, "handleFacebookAccessToken: " + token);
final AuthCredential credential = FacebookAuthProvider.getCredential(token.getToken());
mAuth.signInWithCredential(credential)
.addOnCompleteListener(activity, new OnCompleteListener<AuthResult>() {
@Override
public void onComplete(@NonNull Task<AuthResult> task) {
if (task.isSuccessful()) {
// Sign in success, update UI with the signed-in user's information
Log.d(TAG, "signInWithCredential:success");
FirebaseUser user = mAuth.getCurrentUser();
authListener.updateSignedUI(user);
}
}
}).addOnFailureListener(activity, new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
Log.w(TAG, "signInWithCredential:failure", e);
if (e instanceof FirebaseAuthUserCollisionException) {
handleLinkingFacebookUsers(credential, activity);
}
}
});
}
private void handleLinkingFacebookUsers(AuthCredential savedFBCredential, Activity activity) {
//AuthCredential credentialFacebook = FacebookAuthProvider.getCredential(token.getToken());
//AuthCredential credentialGoogle = GoogleAuthProvider.getCredential(googleIdToken, null);
mAuth.getCurrentUser()
.linkWithCredential(savedFBCredential) // THIS LINE TROWS NULL POINTER EXCEPTION
.addOnCompleteListener(activity, new OnCompleteListener<AuthResult>() {
@Override
public void onComplete(@NonNull Task<AuthResult> task) {
if (task.isSuccessful()) {
Log.d(TAG, "linkWithCredential:success");
FirebaseUser user = task.getResult().getUser();
authListener.updateSignedUI(user);
} else {
Log.w(TAG, "linkWithCredential:failure", task.getException());
authListener.updateSignedUI(null);
}
// ...
}
});
}
com.google.firebase.auth.FirebaseAuthUserCollisionException: An account already exists with the same email address but different sign-in credentials. Sign in using a provider associated with this email address.
at com.google.firebase.auth.api.internal.zzdv.zza(com.google.firebase:firebase-auth@@19.2.0:42)
at com.google.firebase.auth.api.internal.zzfc.zza(com.google.firebase:firebase-auth@@19.2.0:19)
at com.google.firebase.auth.api.internal.zzes.zza(com.google.firebase:firebase-auth@@19.2.0:34)
at com.google.firebase.auth.api.internal.zzeu.zza(com.google.firebase:firebase-auth@@19.2.0:98)
at com.google.firebase.auth.api.internal.zzeu.zza(com.google.firebase:firebase-auth@@19.2.0:85)