Java 使用Firebase for Android登录Facebook时,不会显示带有使用其他帐户登录选项的弹出窗口
我正在开发一款Android应用程序,需要通过Firebase使用谷歌或Facebook登录。我意识到选择帐户的选项在安装后的第一时间起作用,即要求选择帐户的对话框窗口在首次登录后不会显示。下次您按下登录按钮时,它将使用您以前的FB/Google凭据直接登录。 这些用于使用相应域登录的对话框窗口仅在安装应用程序后首次弹出。我找到了谷歌登录客户端的解决方案(每次应用程序打开时都使用googleSignInClient.signOut()注销客户端),但我仍然没有找到Facebook登录管理器的类似解决方案 这是我的密码: LoginActivity.classJava 使用Firebase for Android登录Facebook时,不会显示带有使用其他帐户登录选项的弹出窗口,java,android,firebase,facebook,firebase-authentication,Java,Android,Firebase,Facebook,Firebase Authentication,我正在开发一款Android应用程序,需要通过Firebase使用谷歌或Facebook登录。我意识到选择帐户的选项在安装后的第一时间起作用,即要求选择帐户的对话框窗口在首次登录后不会显示。下次您按下登录按钮时,它将使用您以前的FB/Google凭据直接登录。 这些用于使用相应域登录的对话框窗口仅在安装应用程序后首次弹出。我找到了谷歌登录客户端的解决方案(每次应用程序打开时都使用googleSignInClient.signOut()注销客户端),但我仍然没有找到Facebook登录管理器的
@Override
protected void onStart(){
super.onStart();
firebaseAuth.addAuthStateListener(authStateListener);
// FirebaseUser currentUser = firebaseAuth.getCurrentUser();
}
@Override
protected void onStop(){
super.onStop();
if (authStateListener != null){
firebaseAuth.removeAuthStateListener(authStateListener);
}
}
signInFBBtn.registerCallback(callbackManager, new FacebookCallback<LoginResult>() {
@Override
public void onSuccess(LoginResult loginResult) {
handleFacebookToken(loginResult.getAccessToken());
}
@Override
public void onCancel() {
Toast.makeText(LoginActivity.this, "Cancelled login. (Facebook)", Toast.LENGTH_SHORT).show();
}
@Override
public void onError(FacebookException error) {
Toast.makeText(LoginActivity.this, "Failed to connect to Facebook. Try again.", Toast.LENGTH_SHORT).show();
}
});
authStateListener = new FirebaseAuth.AuthStateListener() {
@Override
public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) {
FirebaseUser user = firebaseAuth.getCurrentUser();
if (user != null){
updateUI(user);
}
else{
updateUI(null);
}
}
};
accessTokenTracker = new AccessTokenTracker() {
@Override
protected void onCurrentAccessTokenChanged(AccessToken oldAccessToken, AccessToken currentAccessToken) {
if(currentAccessToken == null){
firebaseAuth.signOut();
}
}
};
}
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
callbackManager.onActivityResult(requestCode, resultCode, data);
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == RC_SIGN_IN){
Task<GoogleSignInAccount> task = GoogleSignIn.getSignedInAccountFromIntent(data);
if (task.isSuccessful()){
handleSignInResult(task);
}
else{
Toast.makeText(LoginActivity.this, "Cancelled Google Login.", Toast.LENGTH_SHORT).show();
return;
}
// Toast.makeText(LoginActivity.this, "Entered onActivityResult's if block.", Toast.LENGTH_SHORT).show();
}
}
private void handleFacebookToken(AccessToken token){
AuthCredential credential = FacebookAuthProvider.getCredential(token.getToken());
firebaseAuth.signInWithCredential(credential).addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
@Override
public void onComplete(@NonNull Task<AuthResult> task) {
if (task.isSuccessful()){
FirebaseUser user = firebaseAuth.getCurrentUser();
Toast.makeText(LoginActivity.this, "Signed In. (Facebook)", Toast.LENGTH_SHORT).show();
updateUI(user);
}
else{
Toast.makeText(LoginActivity.this, "Couldn't connect to Facebook. Try Again.", Toast.LENGTH_SHORT).show();
return;
}
}
});
}
@覆盖
受保护的void onStart(){
super.onStart();
firebaseAuth.addAuthStateListener(authStateListener);
//FirebaseUser currentUser=firebaseAuth.getCurrentUser();
}
@凌驾
受保护的void onStop(){
super.onStop();
if(authStateListener!=null){
firebaseAuth.removeAuthStateListener(authStateListener);
}
}
signInFBBtn.registerCallback(callbackManager,new FacebookCallback()){
@凌驾
成功时公共无效(LoginResult LoginResult){
handleFacebookToken(loginResult.getAccessToken());
}
@凌驾
公开作废{
Toast.makeText(LoginActivity.this,“取消登录(Facebook)”,Toast.LENGTH_SHORT.show();
}
@凌驾
public void onError(facebook异常错误){
Toast.makeText(LoginActivity.this,“无法连接到Facebook。请重试。”,Toast.LENGTH_SHORT.show();
}
});
authStateListener=新的FirebaseAuth.authStateListener(){
@凌驾
AuthStateChanged上的公共void(@NonNull FirebaseAuth FirebaseAuth){
FirebaseUser=firebaseAuth.getCurrentUser();
如果(用户!=null){
updateUI(用户);
}
否则{
updateUI(null);
}
}
};
accessTokenTracker=新的accessTokenTracker(){
@凌驾
受保护的onCurrentAccessTokenChanged无效(AccessToken oldAccessToken、AccessToken currentAccessToken){
如果(currentAccessToken==null){
firebaseAuth.signOut();
}
}
};
}
@凌驾
受保护的void onActivityResult(int-requestCode、int-resultCode、@Nullable-Intent-data){
callbackManager.onActivityResult(请求代码、结果代码、数据);
super.onActivityResult(请求代码、结果代码、数据);
if(requestCode==RC\u登录){
Task Task=GoogleSignIn.GetSignedAccountFromIntent(数据);
if(task.issusccessful()){
handleSignInResult(任务);
}
否则{
Toast.makeText(LoginActivity.this,“取消谷歌登录”,Toast.LENGTH_SHORT.show();
返回;
}
//Toast.makeText(LoginActivity.this,“在ActivityResult的if块中输入。”,Toast.LENGTH_SHORT.show();
}
}
私有无效handleFacebookToken(AccessToken令牌){
AuthCredential credential=FacebookAuthProvider.getCredential(token.getToken());
firebaseAuth.signInWithCredential(凭证).addOnCompleteListener(这是新的OnCompleteListener(){
@凌驾
未完成的公共void(@NonNull任务){
if(task.issusccessful()){
FirebaseUser=firebaseAuth.getCurrentUser();
Toast.makeText(LoginActivity.this,“登录(Facebook)”,Toast.LENGTH\u SHORT.show();
updateUI(用户);
}
否则{
Toast.makeText(LoginActivity.this,“无法连接到Facebook。请重试。”,Toast.LENGTH_SHORT.show();
返回;
}
}
});
}
我非常感谢Facebook方面的帮助
p.S.:
你为什么说它没有显示?你从Facebook注销了吗?@AlexMamo是的,我从Facebook注销的唯一目的就是测试它。基本上,用户每次点击“继续使用Facebook”时都需要收到“登录Facebook”弹出窗口按钮,并且应该能够使用任何其他Facebook帐户登录,无论他在他的设备上使用哪个FB帐户。我用谷歌登录解决了这个问题;它有自己的方法[GoogleSignInClient.getInstance().signOut()],但Facebook LoginManager/LoginButton似乎没有任何类似的方法。如果我的问题不清楚,请检查这个问题:我有相同的问题;除了Facebook。我修复了链接中提到的问题;谷歌的问题。