1

我正在使用带有firebase的Facebook身份验证方法,我无法弄清楚如何正确注销用户。在按下“Continue with Facebook”按钮并给它访问我的配置文件之后,按下“注销”按钮并在点击时显示一个对话框。问题是,它实际上并没有记录我出去和状态仍然登录。Android的Firebase Facebook身份验证注销功能

我发现here如何注销从火力地堡和Facebook用户在我的应用程序,但我想不通的地方把这两条线。我正在寻找一个注销功能或类似的东西。

我发现here (different here)什么可能是我的解决方案,但它非常混乱,无法理解。你能帮我么?

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    mAuth = FirebaseAuth.getInstance(); 

    super.onCreate(savedInstanceState); 
    FacebookSdk.sdkInitialize(getApplicationContext()); 
    AppEventsLogger.activateApp(this); 
    setContentView(R.layout.activity_login); 

    mCallbackManager = CallbackManager.Factory.create(); 
    LoginButton loginButton = (LoginButton) findViewById(R.id.button_facebook_login); 
    loginButton.setReadPermissions("email", "public_profile"); 
    loginButton.registerCallback(mCallbackManager, new FacebookCallback<LoginResult>() { 
     @Override 
     public void onSuccess(LoginResult loginResult) { 
      Log.e(TAG, "facebook:onSuccess:" + loginResult); 
      handleFacebookAccessToken(loginResult.getAccessToken()); 
     } 

     @Override 
     public void onCancel() { 
      Log.e(TAG, "facebook:onCancel"); 
      // ... 
     } 

     @Override 
     public void onError(FacebookException error) { 
      Log.e(TAG, "facebook:onError", error); 
      // ... 
     } 
    }); 

    mAuthListener = new FirebaseAuth.AuthStateListener() { 
     @Override 
     public void onAuthStateChanged(@NonNull FirebaseAuth firebaseAuth) { 
      final FirebaseUser user = firebaseAuth.getCurrentUser(); 
      if (user != null) { 
       // User is signed in 
       Log.e(TAG, "onAuthStateChanged:signed_in:" + user.getUid()); 

       DatabaseReference myRef = database.getReference("Users"); 
       myRef.addValueEventListener(new ValueEventListener() { 
        boolean userExists = false; 
        User userFirebase; 

        @Override 
        public void onDataChange(DataSnapshot dataSnapshot) { 
         for (DataSnapshot mydata : dataSnapshot.getChildren()){ 
          userFirebase = mydata.getValue(User.class); 

          if(userFirebase.getEmail().equals(user.getEmail())){ 
           Log.e(TAG, "User found in the database"); 
           userExists = true; 
           Intent intent = new Intent(getBaseContext(), ActivityMain.class); 
           startActivity(intent); 
           break; 
          } 
         } 

         if (!userExists){ 
          DatabaseReference mDatabase = FirebaseDatabase.getInstance().getReference(); 
          mDatabase.child("Users").push().setValue(new User(user.getDisplayName(),user.getEmail(),0,0)); 

          Intent intent = new Intent(getBaseContext(), ActivityMain.class); 
          startActivity(intent); 
         } 
        } 

        @Override 
        public void onCancelled(DatabaseError databaseError) { 

        } 
       }); // checks if the user is in database and writes him if not 

      } else { 
       // User is signed out 
       Log.e(TAG, "onAuthStateChanged:signed_out"); 
      } 
     } 
    }; 


} 

@Override 
public void onStart() { 
    super.onStart(); 
    mAuth.addAuthStateListener(mAuthListener); 
} 

@Override 
public void onStop() { 
    super.onStop(); 
    if (mAuthListener != null) { 
     mAuth.removeAuthStateListener(mAuthListener); 
    } 
} 

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    super.onActivityResult(requestCode, resultCode, data); 

    // Pass the activity result back to the Facebook SDK 
    mCallbackManager.onActivityResult(requestCode, resultCode, data); 
} 

private void handleFacebookAccessToken(AccessToken token) { 
    Log.e(TAG, "handleFacebookAccessToken:" + token); 

    AuthCredential credential = FacebookAuthProvider.getCredential(token.getToken()); 
    mAuth.signInWithCredential(credential) 
      .addOnCompleteListener(this, new OnCompleteListener<AuthResult>() { 
       @Override 
       public void onComplete(@NonNull Task<AuthResult> task) { 
        Log.e(TAG, "signInWithCredential:onComplete:" + task.isSuccessful()); 

        // If sign in fails, display a message to the user. If sign in succeeds 
        // the auth state listener will be notified and logic to handle the 
        // signed in user can be handled in the listener. 
        if (!task.isSuccessful()) { 
         Log.e(TAG, "signInWithCredential", task.getException()); 
         Toast.makeText(getBaseContext(), "Authentication failed.", 
           Toast.LENGTH_SHORT).show(); 
        } 

        // ... 
       } 
      }); 
} 

回答

2

你需要实现自己的按钮,添加和OnClickListener与所提到的2种方法:

Button logoutButton = (Button) findViewById(R.id.logout_button); 
logoutButton.setOnClickListener(new View.OnClickListener() { 
    @Override 
    public void onClick(View view) { 
     FirebaseAuth.getInstance().signOut(); 
     LoginManager.getInstance().logOut(); 
    } 
}); 

不能使用Facebook的注销按钮,因为它只记录了你的facebook和您还需要Firebase注销。

+0

哇,太棒了!非常感谢!我会尽快接受答案! –