Как выйти из приложения с помощью Facebook SDK 4 в Android

Я обновляю приложение, использующее facebook sdk, но у меня возникли проблемы, а официальная документация слишком плохая. В моем приложении пользователь может войти в систему с помощью facebook или с помощью обычной учетной записи (хранящейся на моем сервере), и эти параметры отображаются при запуске приложения. Очевидно, что пользователь также может выйти и войти в систему с другой учетной записью (facebook или нет), и у меня проблема с выходом из facebook. На самом деле я не могу выйти из системы пользователя, связанного с учетной записью facebook. Как я заметил после множества попыток, все изменения статуса facebook отслеживаются AccessTokenTracker и ProfileTracker, которые должны быть созданы только один раз при запуске. Я показываю (и объясняю) свой код. Это код моего входа в систему FragmentActivity, который проверяет, был ли пользователь уже вошел в систему (с помощью facebook или с выделенной учетной записью), и если да, показать следующую активность, иначе показать фрагмент для выбора параметров доступа:

@Override
protected void onCreate(Bundle savedInstanceState) {
    FacebookSdk.sdkInitialize(this.getApplicationContext());
    callbackManager = CallbackManager.Factory.create();

        accessTokenTracker = new AccessTokenTracker() {
            @Override
            protected void onCurrentAccessTokenChanged(AccessToken oldAccessToken, AccessToken currentAccessToken) {
                if (currentAccessToken != null) {
                    Log.i("LOGINACTIVITY", "token tracker, current token valid");
                    AccessToken token = AccessToken.getCurrentAccessToken();
                    //already logged with facebook, show next activity

                } else {
                    //check if current visible activity is logout activity
                    // that contains logout button
                    ActivityManager am = (ActivityManager) LoginActivity.this.getSystemService(ACTIVITY_SERVICE);
                    List<ActivityManager.RunningTaskInfo> taskInfo = am.getRunningTasks(1);

                    String top_activity = taskInfo.get(0).topActivity.getClassName();

                    if (top_activity.equals(getApplicationContext().getPackageName() + ".LogoutActivity")) {
                        //launch new login activity
                        LoginManager.getInstance().logOut();
                        getApplicationContext().startActivity(new Intent(getApplicationContext(),
                                LoginActivity.class).addFlags(Intent.FLAG_ACTIVITY_NEW_TASK));

                    }

                }
            }
        };

        accessTokenTracker.startTracking();

Теперь случилось так, что, когда я нажимаю кнопку выхода, трекер accesstoken выполняет ветвь else, чтобы показать параметры входа, которые он показал, но по какой-то причине приложение автоматически снова входит в систему с помощью facebook (оно вызывается, если ветвь TokenTracker), поэтому пользователь не может выйти из facebook. Что случилось?


person giozh    schedule 08.04.2015    source источник
comment
Что делает ваша LoginActivity?   -  person Ming Li    schedule 08.04.2015
comment
LoginActivity содержит этот код и показывает фрагмент входа в систему (если пользователь еще не вошел в систему) или показывает следующую активность, если пользователь уже вошел в систему   -  person giozh    schedule 09.04.2015
comment
Можете ли вы опубликовать свою полную LoginActivity? Я не могу понять, что здесь пытается сделать ваш код.   -  person Ming Li    schedule 09.04.2015
comment
Спасибо за команду: LoginManager.getInstance (). LogOut (); ты даешь мне жизнь XD   -  person KryNaC    schedule 16.06.2015


Ответы (1)


Обязательно остановите трекер токенов доступа перед выходом из системы, чтобы избежать вызова onCurrentAccessTokenChanged (...) с нулевым значением currentAccessToken, что, согласно вашему коду, приведет к выполнению предложения else.

accessTokenTracker.stopTracking();
LoginManager.getInstance().logOut();

И, кстати, вам не нужно использовать startTracking () сразу после выполнения нового AccessTokenTracker (), поскольку AccessTokenTracker () реализует startTracking ()

AccessTokenTracker.class

public AccessTokenTracker() {
    Validate.sdkInitialized();
    this.receiver = new AccessTokenTracker.CurrentAccessTokenBroadcastReceiver();
    this.broadcastManager = LocalBroadcastManager.getInstance(FacebookSdk.getApplicationContext());
    this.startTracking();
}
person Ashraf Alshahawy    schedule 20.05.2015
comment
Это строка 'accessTokenTracker.stopTracking ();' необходимо для выхода из Facebook ?? Только со строкой LoginManager.getInstance (). LogOut (); мой сеанс facebook выйти из системы - person KryNaC; 16.06.2015
comment
Это необходимо в его сценарии / потоке кода, но не во всех случаях для успешного выхода. - person Ashraf Alshahawy; 16.06.2015
comment
В моем сценарии я вхожу в систему с помощью Facebook, и я беру имя пользователя и профиль изображения ... когда я выхожу из своего приложения, я должен поставить 'accessTokenTracker.stopTracking ();' ?? Спасибо - person KryNaC; 17.06.2015
comment
Нет, нет ... Если это только то, что вы делаете, и вы не используете accessTokenTracker.StartTracking (), вам не нужно вызывать stopTracking () - person Ashraf Alshahawy; 17.06.2015
comment
Я выполнил инструкции и добавил accessTokenTracker.StartTracking () в свой метод регистрации, но я не знаю, что это такое и нужно ли это при регистрации ... - person KryNaC; 18.06.2015
comment
Если вы не используете / не выполняете какой-либо код в accessTokenTracker.startTracking (), не используйте его, а если вы его используете, обязательно вызывайте .stopTracking (), когда пользователь выходит из системы. Вот и все. - person Ashraf Alshahawy; 18.06.2015
comment
@KryNaC Если вы нашли мой ответ полезным для вас и решили вашу проблему, было бы здорово выбрать его в качестве ответа. - person Ashraf Alshahawy; 27.01.2016