Facebook SDK 4 na Androida - jak wylogować się programowo


112

Niedawno Facebook wypuścił SDK 4 z nowymi i fajnymi aktualizacjami. Próbowałem przejść na SDK4, aby korzystać z nowych funkcji, jednak mam problemy z funkcją logowania na Facebooku.

Do tej pory, aby wylogować się programowo z Facebooka, użyłem:

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

Ale wydaje się, że SDK4 nie obsługuje już Session, aw oficjalnych dokumentach wspomina się o:

Istnieją dwa sposoby zaimplementowania logowania do Facebooka na Androida:

Klasa LoginButton - która zawiera przycisk, który możesz dodać do swojego interfejsu użytkownika. Jest zgodny z aktualnym tokenem dostępu i może logować i wylogowywać ludzi.

Cóż, wygląda na to, że nie ma możliwości programowego wylogowania się z Facebooka, z wyjątkiem użycia LoginButton. Każdy, kto ma jakiś pomysł, podziel się nim tutaj.

Odpowiedzi:


276

Możesz użyć LoginManager.getInstance().logOut();, nawet jeśli używasz LoginButton, ponieważ

Ten element interfejsu użytkownika opakowuje funkcje dostępne w narzędziu LoginManager.

EDYCJA: Wystarczy wspomnieć, że działa to w przypadku zestawu SDK Facebooka v4 . Nie wiem, czy w przyszłości to zmienią.

@ Jak wspomina batoutofhell, nie zapomnij FacebookSdk.sdkInitialize(getApplicationContext());o zainicjowaniu sdk facebooka. Szczegółowe informacje można znaleźć tutaj .


2
Chcę wspomnieć, ponieważ jest to najwyższy wynik Google, moja aplikacja uległa awarii podczas próby wylogowania, dopóki nie dodałem najpierw tej linii: FacebookSdk.sdkInitialize (this.getApplicationContext ()); LoginManager.getInstance (). LogOut ();
batoutofhell

7
Po wylogowaniu nie mogę się ponownie zalogować. Czy istnieje sposób, aby zalogować się ponownie po wykonaniu LoginManager.getInstance (). LogOut ();
AndroidDev

1
Dlaczego powinniśmy wywoływać FacebookSdk.sdkInitialize, skoro został już zainicjowany w onCreate?
CoolMind

1
LoginManager.logOut () Użyłem tego, działa poprawnie
Erum

1
@Erum Nie ma obecnie takiej metody LoginManager.logOut()w FB SDK v4.23.0
Gem

61

SDK4, jeśli chcesz całkowicie odłączyć, upewnij się, że usunąłeś również aplikację z konta na Facebooku użytkownika. Ta metoda całkowicie rozłącza użytkownika:

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();
}

Właśnie tego chciałem!
Sash_KP,

Oznacza to, że muszę usunąć aplikację i wiadomość na Facebooku, aby wylogować się z mojej aplikacji?
phongvan

1
Ta odpowiedź zapewnia całkowite wylogowanie użytkownika. Aby być na 100% konieczne jest dołączenie FacebookSdk.sdkInitialize (getApplicationContext ());
Sandro Wiggers

W wywołaniu zwrotnym dodałem również @Override public void onCompleted (GraphResponse graphResponse) {AccessToken.setCurrentAccessToken (null); LoginManager.getInstance (). LogOut (); }
Sandro Wiggers

1
Uważam, że @voghDev onCompleted nie powraca do wątku interfejsu użytkownika, więc nie blokuje go, gdy wywołujesz logOut tam.
Frank


7

Aby sobie z tym poradzić za pomocą przycisku 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();
                }
            });
        }

Hej Stevie, kiedy wywołałem metodę logOut (), jak wspomniałeś w swojej odpowiedzi, dało mi to błąd "java.lang.SecurityException: Permission Denial: get / set ustawienie dla użytkownika prosi o uruchomienie jako użytkownik -2, ale dzwoni od użytkownika 0; ”. Prosi mnie o dodanie pozwolenia w pliku manifestu. Jak mogę rozwiązać ten problem, ponieważ nie chcę udzielać tego pozwolenia, ponieważ wylogowanie powinno być normalną procedurą.
Aditya

@Aditya Potrzebujesz tylko pozwolenia internetowego dla aplikacji. <uses-permission android:name="android.permission.INTERNET" />
stephen

Ale otrzymuję powyższy błąd, jeśli go nie dodam. Jeśli to możliwe, czy możesz podzielić się próbką z Facebooka, która ma niestandardowy przycisk logowania i niestandardowy przycisk wylogowania?
Aditya,

@Aditya w tym przykładzie używam przycisku logowania na Facebooku
stephen

4

Możesz się wylogować za pomocą narzędzia LoginManager, ale musisz również użyć żądania wykresu. Mówię o całkowitym wylogowaniu się, aby następnym razem móc zalogować się na inne konto.

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();

Za pomocą udostępnionych tutaj preferencji możesz całkowicie się wylogować, a następnym razem zalogować się na inne konto.


1

Wersja Frank 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()
}
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.