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

哇,太棒了!非常感謝!我會盡快接受答案! –