我正尝试在android中使用facebook sdk和“user/password”选项进行firebase身份验证。我需要知道在启动MainActivity之前用户使用了哪种认证。执行命令firebase auth
几天前该代码用于正常工作,但我不得不抹去firebase项目。今天我配置了firebase/facebook sdk并且它可以工作。但是现在执行代码的顺序是不同的(我知道这很奇怪)。
之前,onComplete
方法(当我验证任务是否成功时)首先执行,然后执行onAuthStateChanged
。但现在首先执行onAuthStateChanged
方法,启动其他活动,然后验证任务是否成功。我在调试模式下看到了这种行为。
这里是代码例子,我非常感谢提前任何帮助
fbLoginButton.registerCallback(callbackManager, new FacebookCallback<LoginResult>() {
@Override
public void onSuccess(LoginResult loginResult) {
//Inicio de sesion con facebook exitoso
handleFacebookAccessToken(loginResult.getAccessToken());
}
@Override
public void onCancel() {
//Inicio de sesion con facebook cancelado
Toast.makeText(getApplicationContext(),R.string.cancel_fb_log,Toast.LENGTH_SHORT).show();
}
@Override
public void onError(FacebookException error) {
//Inicio de sesion con facebook erroneo
Toast.makeText(getApplicationContext(),R.string.error_fb_log,Toast.LENGTH_SHORT).show();
}
});
private void handleFacebookAccessToken(AccessToken accessToken) {
relativeLayout.setVisibility(View.GONE);
relativeLayout1.setVisibility(View.VISIBLE);
AuthCredential credential = FacebookAuthProvider.getCredential(accessToken.getToken());
//Iniciar sesión con una credencial
firebaseAuth.signInWithCredential(credential).addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
//metodo que se ejecuta al terminar el proceso
@Override
public void onComplete(@NonNull Task<AuthResult> task) {
if (!task.isSuccessful()){
//Ocurrio un error al realizar el logueo a firebase con facebook
Utilities.exceptionFirebaseAdministrator(LoginActivity.this, task, LOG_TAG);
LoginManager.getInstance().logOut();
}else{
pref.edit().putBoolean(getString(R.string.pref_logged_with_facebook),true).apply();
pref.edit().putBoolean(getString(R.string.pref_logged_with_firebase),false).apply();
}
relativeLayout.setVisibility(View.VISIBLE);
relativeLayout1.setVisibility(View.GONE);
}
});
}
fireAuthStateListener = new FirebaseAuth.AuthStateListener() {
@Override
public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) {
FirebaseUser user = firebaseAuth.getCurrentUser();
if(user != null){
//I try use SharedPreference and validate if is facebook login or other
startMainActivity();
}
}
};
@Override
public void onStart() {
super.onStart();
//Cuando la clase empieza a "escuchar"
firebaseAuth.addAuthStateListener(fireAuthStateListener);
}
@Override
public void onStop() {
super.onStop();
//Cuando la clase deja de "escuchar"
firebaseAuth.removeAuthStateListener(fireAuthStateListener);
}
这是其他形式,它的工作原理谢谢(我如何投票反馈,我只现在点击向上箭头),但它似乎很奇怪,有时执行的顺序是onComplete,后来onAuthStateChanged。 有没有什么办法知道onAuthStateChanged方法,如果用户注册使用Facebook或电子邮件/密码步骤? –
是的,你可以使用user.getProviders()。get(0)来检查提供者,返回类型是字符串,在if(user!= null)中使用。看到上面编辑的答案 –
好的,谢谢很多糖! –