Facebook SDK 4 per Android: come disconnettersi a livello di programmazione


112

Di recente, Facebook ha rilasciato l'SDK 4 con nuovi e fantastici aggiornamenti. Ho provato a passare a SDK4 per utilizzare nuove funzionalità, tuttavia, sto lottando con la funzionalità di accesso di Facebook.

Finora, per disconnettermi da Facebook in modo programmatico, ho usato:

Session session = Session.getActiveSession();
session.closeAndClearTokenInformation();

Ma SDK4 sembra non supportare più Session e nei documenti ufficiali menzionano:

Esistono due modi per implementare l'accesso a Facebook su Android:

Classe LoginButton: fornisce un pulsante che puoi aggiungere alla tua interfaccia utente. Segue il token di accesso corrente e può accedere e disconnettere le persone.

Bene, sembra che non ci sia modo di disconnettersi da Facebook in modo programmatico se non usando LoginButton. Se qualcuno ha un'idea, condividila qui.

Risposte:


276

Puoi usare LoginManager.getInstance().logOut();, anche se usi LoginButton perché

Questo elemento dell'interfaccia utente racchiude le funzionalità disponibili in LoginManager.

EDIT: solo per menzionare che funziona per Facebook SDK v4 . Non so se lo cambieranno in futuro.

@ come menzionato in batoutofhell, non dimenticare di mettere FacebookSdk.sdkInitialize(getApplicationContext());per inizializzare l'SDK di Facebook. Si prega di vedere qui per i dettagli.


2
Voglio menzionare poiché questo è il primo risultato di Google, la mia app si è bloccata durante il tentativo di disconnettersi fino a quando non ho aggiunto prima questa riga: FacebookSdk.sdkInitialize (this.getApplicationContext ()); . LoginManager.getInstance () logout ();
batoutofhell

7
Dopo il logout non mi consentirà di accedere nuovamente. C'è un modo per accedere di nuovo dopo aver eseguito LoginManager.getInstance (). LogOut ();
AndroidDev

1
Perché dovremmo chiamare FacebookSdk.sdkInitialize, poiché è già stato inizializzato in onCreate?
CoolMind

1
LoginManager.logOut () l'ho usato, funziona correttamente
Erum

1
@Erum Al momento non esiste un metodo simile LoginManager.logOut()in FB SDK v4.23.0
Gem

61

SDK4, se vuoi disaccoppiare completamente, assicurati di rimuovere anche l'app dall'account Facebook dell'utente. Questo metodo disconnette completamente l'utente:

public void disconnectFromFacebook() {

    if (AccessToken.getCurrentAccessToken() == null) {
        return; // already logged out
    }

    new GraphRequest(AccessToken.getCurrentAccessToken(), "/me/permissions/", null, HttpMethod.DELETE, new GraphRequest
            .Callback() {
        @Override
        public void onCompleted(GraphResponse graphResponse) {

            LoginManager.getInstance().logOut();

        }
    }).executeAsync();
}

Questo è esattamente quello che volevo!
Sash_KP

Ciò significa che devo rimuovere l'app Facebook e il messaggio di Facebook per completare il logout per la mia app?
phongvan

1
Questa risposta garantisce che l'utente si sia disconnesso completamente. Solo per essere al 100% è necessario includere FacebookSdk.sdkInitialize (getApplicationContext ());
Sandro Wiggers

Nella richiamata ho anche aggiunto @Override public void onCompleted (GraphResponse graphResponse) {AccessToken.setCurrentAccessToken (null); . LoginManager.getInstance () logout (); }
Sandro Wiggers

1
@voghDev onCompleted non torna sul thread dell'interfaccia utente credo, quindi non lo blocca quando chiami logOut lì.
Frank


7

Per gestirlo con il loginButton:

//Check if user is currently logged in
        if (AccessToken.getCurrentAccessToken() != null && com.facebook.Profile.getCurrentProfile() != null){
            //Logged in so show the login button
            fbLogin.setVisibility(View.VISIBLE);
            fbLogin.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
//log out
                    LoginManager.getInstance().logOut();
                    gotoLogin();
                }
            });
        }

Ehi Stevie, quando ho chiamato il metodo logOut () come hai menzionato nella tua risposta, mi ha dato l'errore "java.lang.SecurityException: Permission Denial: get / set setting for user chiede di essere eseguito come utente -2 ma sta chiamando dall'utente 0;". Mi sta chiedendo di aggiungere un'autorizzazione nel file manifest. Come posso risolverlo perché non voglio dare questa autorizzazione perché il logout dovrebbe essere una procedura normale.
Aditya

@Aditya Hai solo bisogno dell'autorizzazione Internet per l'App. <uses-permission android:name="android.permission.INTERNET" />
stephen

Ma ricevo l'errore sopra, se non lo aggiungo. Se possibile, puoi condividere un esempio di Facebook con un pulsante di accesso personalizzato e un pulsante di logout personalizzato ??
Aditya

@Aditya in questo esempio sto usando il pulsante di accesso di Facebook
stephen

4

Puoi disconnetterti usando LoginManager ma devi anche usare la richiesta del grafico. Sto parlando di disconnettersi completamente in modo che la prossima volta sia possibile accedere con un account diverso.

new GraphRequest(AccessToken.getCurrentAccessToken(), "/me/permissions/", null, HttpMethod.DELETE, new GraphRequest
            .Callback() {
        @Override
        public void onCompleted(GraphResponse graphResponse) {

            SharedPreferences pref = DashBoard.this.getPreferences(Context.MODE_PRIVATE);
            SharedPreferences.Editor editor = pref.edit();
            editor.clear();
            editor.commit();
            LoginManager.getInstance().logOut();

            Intent logoutint = new Intent(DashBoard.this,MainActivity.class);
            logoutint.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
               startActivity(logoutint);

        }
    }).executeAsync();

Con l'aiuto delle preferenze condivise qui puoi disconnetterti completamente e la prossima volta puoi accedere con un account diverso.


1

Frank versione kotlin:

 fun disconnectFromFacebook() {
    if (AccessToken.getCurrentAccessToken() == null) {
        return  // already logged out
    }
    GraphRequest(
        AccessToken.getCurrentAccessToken(),
        "/me/permissions/",
        null,
        HttpMethod.DELETE,
        GraphRequest.Callback {
            LoginManager.getInstance().logOut()
        }).executeAsync()
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.