Як програмно вийти з Facebook SDK 3.0 без використання кнопки входу / виходу з Facebook?


80

Назва говорить все. Я використовую спеціальну кнопку, щоб отримати інформацію про facebook користувача (для цілей "реєстрації"). Тим не менше, я не хочу, щоб програма пам’ятала останнього зареєстрованого користувача, а також того, хто зараз ввійшов в систему через рідну програму Facebook. Я хочу, щоб активність входу в Facebook з’являлася щоразу. Ось чому я хочу програмно вийти з усіх попередніх користувачів.

Як я можу це зробити? Ось як я роблю вхід:

private void signInWithFacebook() {

    SessionTracker sessionTracker = new SessionTracker(getBaseContext(), new StatusCallback() 
    {
        @Override
        public void call(Session session, SessionState state, Exception exception) { 
        }
    }, null, false);

    String applicationId = Utility.getMetadataApplicationId(getBaseContext());
    mCurrentSession = sessionTracker.getSession();

    if (mCurrentSession == null || mCurrentSession.getState().isClosed()) {
        sessionTracker.setSession(null);
        Session session = new Session.Builder(getBaseContext()).setApplicationId(applicationId).build();
        Session.setActiveSession(session);
        mCurrentSession = session;
    }

    if (!mCurrentSession.isOpened()) {
        Session.OpenRequest openRequest = null;
        openRequest = new Session.OpenRequest(RegisterActivity.this);

        if (openRequest != null) {
            openRequest.setPermissions(null);
            openRequest.setLoginBehavior(SessionLoginBehavior.SSO_WITH_FALLBACK);

            mCurrentSession.openForRead(openRequest);
        }
    }else {
        Request.executeMeRequestAsync(mCurrentSession, new Request.GraphUserCallback() {
              @Override
              public void onCompleted(GraphUser user, Response response) {
                  fillProfileWithFacebook( user );
              }
            });
    }
}

В ідеалі, я би зателефонував на початку цього методу, щоб вийти з попередніх користувачів.

Відповіді:


161

Оновлення для останнього SDK:

Тепер відповідь @ zeuter правильна для Facebook SDK v4.7 +:

LoginManager.getInstance().logOut();

Оригінальна відповідь:

Будь ласка, не використовуйте SessionTracker. Це внутрішній (приватний пакет) клас і не призначений для споживання як частина загальнодоступного API. Таким чином, його API може змінюватися в будь-який час без будь-яких гарантій зворотної сумісності. Ви повинні бути в змозі позбутися всіх екземплярів SessionTracker у своєму коді і просто використовувати активний сеанс.

Щоб відповісти на ваше запитання, якщо ви не хочете зберігати дані сеансу, просто зателефонуйте closeAndClearTokenInformation, коли ваша програма закриється.


3
Ви просто викликаєте Session.getActiveSession, і якщо воно повертає null, ви можете або 1.) створити нову сесію за допомогою Session.Builder, і викликати Session.setActiveSession, або 2.) викликати один із методів Session.openActiveSession (статичний one, який одночасно відкриває та встановлює для вас активний сеанс).
Ming Li

24
І той факт, що вам потрібно відкрити сесію, щоб вийти, показує, наскільки поганий дизайн Facebook SDK ... Замість того, щоб пропонувати простий загальнодоступний API зі стандартними зворотними викликами, ви повинні застосувати безглуздий механізм ... дивовижно.
Мартін Маркончіні

18
Facebook SDK та документація жалюгідні!
Skynet

3
Офіційні документи Facebook містять код у прикладах, який є застарілим. Тоді ми маємо посилатися на старий добрий стек, щоб скасувати те саме.
Skynet

1
Замість того, щоб додавати коментарі, які не сприяють розмові, вам слід навести конкретні приклади, коли бракує документації (що стосується запитання / відповіді), або ви можете перейти до кінця певної сторінки документації на порталі розробника та натиснути на кнопці "Ні" для "Чи був цей документ корисним?".
Ming Li

87

Цей метод допоможе вам вийти з facebook програмно в android

/**
 * Logout From Facebook 
 */
public static void callFacebookLogout(Context context) {
    Session session = Session.getActiveSession();
    if (session != null) {

        if (!session.isClosed()) {
            session.closeAndClearTokenInformation();
            //clear your preferences if saved
        }
    } else {

        session = new Session(context);
        Session.setActiveSession(session);

        session.closeAndClearTokenInformation();
            //clear your preferences if saved

    }

}

3
Для мене було єдиним робочим рішенням у випадку використання фрагментів замість Activity;
Roger Alien

чому у вас є інша частина в коді? Якщо користувач не входить в систему, чому потрібно буде ввійти в нього ще раз, а потім вийти?
Vihaan Verma

1
отримання помилки java.lang.NullPointerException: Аргумент 'applicationId' не може бути нульовим
Krunal Shah

Я думаю, що відповідним способом ініціалізації сеансу є new Session.Builder (context) .build ();
hasan

66

Оскільки Android SDK v4.0 Facebook (див. Журнал змін ), вам потрібно виконати наступне:

LoginManager.getInstance().logOut();

7
Дякую, але я не бачу, що це насправді очищає сесію. LoginManager.logout () просто внутрішньо викликає "AccessToken.setCurrentAccessToken (null); Profile.setCurrentProfile (null);". Я бачу, що користувач все ще може ввійти в систему без необхідності повторного введення облікових даних під час наступного запуску програми. Як змусити користувача повторно ввести свої облікові дані?
swooby

Цей метод мені допоміг. Після його виклику та спроби повторного входу, як і очікувалося, з’явився екран введення облікових даних. Дякую тонна.
Zsolt Boldizsár

1
Як зазначив @swooby, це рішення, на жаль, не працює у програмах, що використовують facebook sdk v4.x. Після входу в систему AccessToken має [{марку AccessToken: ACCESS_TOKEN_REMOVED дозволи: [public_profile]}], але AccessToken.getCurrentAccessToken (). GetToken () повертає дійсний маркер. рядок, навіть якщо користувач більше не реєструється або скасував авторизацію програми.
Lisitso

@Lisitso Чи знаєте ви зараз це рішення?
Jaec

1
@Jaec Я скористався рішенням, наданим "Aniket Thakur". Ви можете знайти тут серед інших відповідей. На здоров’я!
Лісіцо

27

Ось фрагмент, який дозволив мені програмно вийти з facebook. Повідомте мене, якщо ви побачите щось, що мені може знадобитися для вдосконалення.

private void logout(){
    // clear any user information
    mApp.clearUserPrefs();
    // find the active session which can only be facebook in my app
    Session session = Session.getActiveSession();
    // run the closeAndClearTokenInformation which does the following
    // DOCS : Closes the local in-memory Session object and clears any persistent 
    // cache related to the Session.
    session.closeAndClearTokenInformation();
    // return the user to the login screen
    startActivity(new Intent(getApplicationContext(), LoginActivity.class));
    // make sure the user can not access the page after he/she is logged out
    // clear the activity stack
    finish();
}

що таке jpotter6 mApp?
Amitsharma

Екземпляр класу Application, доступний у будь-якій програмі Android
Eenvincible

13

Оскільки Android SDK v4.0 від Facebook потрібно виконати наступне:

LoginManager.getInstance().logOut();

Цього недостатньо. Це просто очистить кешований маркер доступу та профіль, так що AccessToken.getCurrentAccessToken()і Profile.getCurrentProfile()тепер стане нульовим.

Для повного виходу потрібно скасувати дозволи, а потім зателефонувати LoginManager.getInstance().logOut();. Щоб скасувати дозвіл, виконайте наступний графічний API -

    GraphRequest delPermRequest = new GraphRequest(AccessToken.getCurrentAccessToken(), "/{user-id}/permissions/", null, HttpMethod.DELETE, new GraphRequest.Callback() {
        @Override
        public void onCompleted(GraphResponse graphResponse) {
            if(graphResponse!=null){
                FacebookRequestError error =graphResponse.getError();
                if(error!=null){
                    Log.e(TAG, error.toString());
                }else {
                    finish();
                }
            }
        }
    });
    Log.d(TAG,"Executing revoke permissions with graph path" + delPermRequest.getGraphPath());
    delPermRequest.executeAsync();

2
Це правильна відповідь на це питання. LoginManager.getInstance().logOut();лише очищає локальний кеш, тоді як GraphRequestдзвінок програмно скасовує доступ до програми з облікового запису користувача у Facebook. Обоє необхідні. І того, і іншого недостатньо.
YS

Куди ми повинні помістити цей код для дозволів на видалення ?! У моєму випадку код не працює! Чи можете ви надати повний фрагмент коду, сер.!?
Akshay Shinde

Код працює, але дає попередження: Запит без маркера доступу відсутній ідентифікатор програми або маркер клієнта Чи потрібно щось додавати до "/ {user-id} / permissions /" у наведеному вище коді?
zeeshan

@zeeshan заміни {user-id} на мене
Amritpal singh

8

Клас сеансу видалено на SDK 4.0. Зміна входу здійснюється за допомогою класу LoginManager . Так:

mLoginManager = LoginManager.getInstance();
mLoginManager.logOut();

Як сказано в посиланні оновлення до SDK 4.0 :

Видалено сеанс - класи AccessToken, LoginManager та CallbackManager замінюють і замінюють функціональність у класі Session.


1
Відповідь zeuter коротша і вказує на той самий дзвінок api. Чому дублікат?
rekire

3

Так, як згадував @luizfelippe Клас сеансу було видалено з SDK 4.0. Нам потрібно використовувати LoginManager.

Я просто заглянув до класу LoginButton для виходу. Вони роблять такий вид перевірки. Вони виходять із системи, лише якщо accessToken не має значення null. Отже, я думаю, що краще мати це і в нашому коді ..

AccessToken accessToken = AccessToken.getCurrentAccessToken();
if(accessToken != null){
    LoginManager.getInstance().logOut();
}

Відповідь zeuter коротша і вказує на той самий дзвінок api. Чому дублікат?
rekire

0
private Session.StatusCallback statusCallback = new SessionStatusCallback();

logout.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
Session.openActiveSession(this, true, statusCallback);  
}
});

private class SessionStatusCallback implements Session.StatusCallback {
@Override
public void call(Session session, SessionState state,
Exception exception) {
session.closeAndClearTokenInformation();    
}
}

0

Facebook пропонує два способи входу та виходу з облікового запису. Один - використовувати LoginButton, а інший - LoginManager. LoginButton - це просто кнопка, за якою після натискання вхід здійснюється. З іншого боку LoginManager робить це самостійно. У вашому випадку ви використовуєте LoginManager для автоматичного виходу з системи.

LoginManager.getInstance().logout() робить це за вас.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.