我正在尝试通过Google实施Firebase身份验证。在登录按钮上,单击AuthCredential
时,我会得到onActivityResult()
的详细信息:
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == RC_SIGN_IN) {
Task<GoogleSignInAccount> task = GoogleSignIn.getSignedInAccountFromIntent(data);
try {
GoogleSignInAccount account = task.getResult(ApiException.class);
if (account != null) {
String tokenId = account.getIdToken();
AuthCredential credential = GoogleAuthProvider.getCredential(tokenId, null);
initViewModel(credential);
}
} catch (ApiException e) {}
}
}
这就是我初始化ViewModel
的方式:
private void initViewModel(AuthCredential credential) {
viewModel = ViewModelProviders.of(this, factory).get(SignInViewModel.class);
viewModel.signInWithGoogle(credential).observe(this, task -> {
if (task.isSuccessful()) {
FirebaseUser user = auth.getCurrentUser();
if (user != null) {
createUser(user);
} else {
Log.d(TAG, "user = null");
}
}
});
}
创建用户后,我将被重定向到第二个活动。到现在为止,一切正常。问题是在第二个活动中退出时出现的,我被重定向到SignInActivity
,由于某种原因initSignInViewModel
被两次调用,一次是无故打印user = null
而第二次当我按下登录按钮时。
如何阻止这种情况的发生?我只想在按下按钮时被触发。谢谢。
编辑:
在我退出的活动中,我使用以下代码。首先,我实现FirebaseAuth.AuthStateListener
接口并重写此方法:
@Override
public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) {
FirebaseUser firebaseUser = firebaseAuth.getCurrentUser();
if (firebaseUser == null) {
Intent intent = new Intent(MainActivity.this, SignInActivity.class);
startActivity(intent);
}
}
这是退出代码,当我按下按钮时会被调用:
FirebaseAuth.getInstance().signOut();
if (googleApiClient.isConnected()) {
Auth.GoogleSignInApi.signOut(googleApiClient);
}
答案 0 :(得分:0)
尝试在“活动处理”注销中执行此操作:
//Declaration and defination
private FirebaseAuth firebaseAuth;
FirebaseAuth.AuthStateListener authStateListener = new FirebaseAuth.AuthStateListener() {
@Override
public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) {
if (firebaseAuth.getCurrentUser() == null){
//Do anything here which needs to be done after signout is complete
signOutComplete();
}
else {
}
}
};
//Init and attach
firebaseAuth = FirebaseAuth.getInstance();
firebaseAuth.addAuthStateListener(authStateListener);
//Call signOut()
firebaseAuth.signOut();