Facebook SDK 4 для Android - как программно выйти из системы

Недавно Facebook выпустил SDK 4 с новыми интересными обновлениями. Я пытался переключиться на SDK4, чтобы использовать новые функции, однако у меня возникают проблемы с функцией входа в Facebook.

До сих пор для программного выхода из Facebook я использовал:

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

Но SDK4, похоже, больше не поддерживает сеанс, и в официальных документах они упоминают:

Есть два способа реализовать вход через Facebook на Android:

Класс LoginButton - который предоставляет кнопку, которую вы можете добавить в свой пользовательский интерфейс. Он следует текущему токену доступа и может выполнять вход и выход пользователей.

Что ж, похоже, нет никакого способа выйти из Facebook программно, кроме как с помощью LoginButton. У кого-нибудь есть идеи, поделитесь ими здесь.


person franco phong    schedule 27.03.2015    source источник


Ответы (6)


Вы можете использовать LoginManager.getInstance().logOut();, даже если используете LoginButton, потому что

Этот элемент пользовательского интерфейса включает в себя функции, доступные в LoginManager.

РЕДАКТИРОВАТЬ: Просто отметим, что это работает для Facebook SDK v4. Не знаю, изменят ли они это в будущем.

@ as batoutofhell, не забудьте указать FacebookSdk.sdkInitialize(getApplicationContext()); для инициализации sdk facebook. Подробнее см. здесь.

person stackex    schedule 10.04.2015
comment
Я хочу упомянуть, поскольку это лучший результат Google, мое приложение вылетало при попытке выйти из системы, пока я сначала не добавил эту строку: FacebookSdk.sdkInitialize (this.getApplicationContext ()); LoginManager.getInstance (). LogOut (); - person batoutofhell; 26.05.2015
comment
После выхода из системы я не смогу снова войти в систему. Есть ли способ снова войти в систему после того, как я выполнил LoginManager.getInstance (). LogOut (); - person AndroidDev; 03.08.2015
comment
Большое спасибо @stackex, это было очень полезно и сэкономило время - person Antroid; 27.09.2016
comment
Почему мы должны вызывать FacebookSdk.sdkInitialize, если он уже инициализирован в onCreate? - person CoolMind; 23.01.2017
comment
это не работает для меня ..... в facebook после входа в систему через мое приложение, но я пытаюсь выйти из системы, но снова нажимаю кнопку facebook, это показывает, что вы вошли в систему ..... вы хотите выйти или отменить, почему? - person Erum; 26.01.2017
comment
@erum ты понял свою проблему? У меня такая же. - person MortalMan; 07.03.2017
comment
LoginManager.logOut () я использовал это, он работает правильно - person Erum; 07.03.2017
comment
@Erum В FB SDK v4.23.0 такого метода LoginManager.logOut() на данный момент нет - person Gem; 22.07.2017
comment
Это работает, в отличие от FirebaseAuth.getInstance (). SignOut (). Последний работает для входа в google только почему-то ... - person Liker777; 18.04.2021

SDK4, если вы хотите полностью разъединить, убедитесь, что вы также удалили приложение из учетной записи пользователя facebook. Этот метод полностью отключает пользователя:

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();
}
person Frank    schedule 09.09.2015
comment
Это именно то, что я хотел! - person Sash_KP; 14.01.2016
comment
Это означает, что я должен удалить приложение Facebook и сообщение Facebook, чтобы завершить выход из моего приложения? - person mdtuyen; 25.01.2016
comment
Этот ответ гарантирует, что пользователь полностью вышел из системы. Для 100% необходимо включить FacebookSdk.sdkInitialize (getApplicationContext ()); - person Sandro Wiggers; 25.08.2016
comment
В обратном вызове я также добавил @Override public void onCompleted (GraphResponse graphResponse) {AccessToken.setCurrentAccessToken (null); LoginManager.getInstance (). LogOut (); } - person Sandro Wiggers; 25.08.2016
comment
что делает .logOut ()? Это асинхронно? Будет ли он блокировать мой поток пользовательского интерфейса на несколько миллисекунд? Я думаю, что .logOutAsync () будет иметь больше смысла - person voghDev; 30.08.2016
comment
Я полагаю, что @voghDev onCompleted не возвращается в поток пользовательского интерфейса, поэтому он не блокирует его, когда вы вызываете там logOut. - person Frank; 28.12.2016
comment
В моем случае onCompleted не был вызван, поэтому я использовал принятый ответ. - person CoolMind; 23.01.2017
comment
Спасибо. Это именно то, что я ищу. - person viper; 04.08.2017
comment
У меня сработало, спасибо за решение! - person hetsgandhi; 08.12.2020

Вы можете использовать LoginManager.logOut()

Ознакомьтесь с https://developers.facebook.com/docs/reference/android/current/class/LoginManager/

person Chris Pan    schedule 27.03.2015
comment
Это работает, если вы используете LoginManager. Есть ли способ программного выхода из системы при использовании LoginButton? - person Singed; 02.04.2015
comment
Я также хочу знать, как мы можем выйти из системы при использовании LoginButton. - person sarath; 22.04.2015
comment
просто используйте LoginButton, щелкните его еще раз, и он выйдет из системы - person Beeing Jk; 04.05.2016

Чтобы обработать это с помощью кнопки входа в систему:

//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();
                }
            });
        }
person stephen    schedule 01.06.2015
comment
Привет, Стиви, когда я вызвал метод logOut (), как вы упомянули в своем ответе, он дал мне ошибку java.lang.SecurityException: Permission Denial: получить / установить параметр для пользователя, который запрашивает запуск от имени пользователя -2, но звонит от пользователя 0 ;. Он просит меня добавить разрешение в файл манифеста. Как я могу решить эту проблему, потому что я не хочу давать это разрешение, поскольку выход из системы должен быть нормальной процедурой. - person Aditya; 08.06.2015
comment
@Aditya Вам нужно только разрешение на доступ к Интернету для приложения. <uses-permission android:name="android.permission.INTERNET" /> - person stephen; 09.06.2015
comment
Но я получаю сообщение об ошибке, если не добавляю ее. Если возможно, не могли бы вы поделиться образцом facebook, который имеет пользовательскую кнопку входа в систему и пользовательскую кнопку выхода? - person Aditya; 09.06.2015
comment
@Aditya в этом примере я использую кнопку входа в facebook - person stephen; 09.06.2015

Вы можете выйти из системы с помощью LoginManager, но вы также должны использовать запрос графика. Я говорю о полном выходе из системы, чтобы в следующий раз вы могли войти в систему с другой учетной записью.

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

С помощью общих настроек здесь вы можете полностью выйти из системы, а в следующий раз вы можете войти в систему с другой учетной записью.

person Ritesh Jha    schedule 11.04.2017

Откровенная версия котлина:

 fun disconnectFromFacebook() {
    if (AccessToken.getCurrentAccessToken() == null) {
        return  // already logged out
    }
    GraphRequest(
        AccessToken.getCurrentAccessToken(),
        "/me/permissions/",
        null,
        HttpMethod.DELETE,
        GraphRequest.Callback {
            LoginManager.getInstance().logOut()
        }).executeAsync()
}
person Andrea Leganza    schedule 13.07.2020