it-roy-ru.com

Использование Facebook SDK на Android дает "Пользователь вошел в систему как другой пользователь Facebook". ошибка

Я обновляю свое использование Facebook SDK до последней версии. Следующий код довольно сильно поднят строкой из собственных примеров Facebook, которые можно найти здесь: https://developers.facebook.com/docs/facebook-login/Android/v2.3

import Android.content.Intent;
import Android.os.Bundle;
import Android.support.v4.app.FragmentActivity;
import Android.util.Log;

import com.facebook.CallbackManager;
import com.facebook.FacebookCallback;
import com.facebook.FacebookException;
import com.facebook.FacebookSdk;
import com.facebook.login.LoginManager;
import com.facebook.login.LoginResult;

import Java.util.Arrays;

public class TestFb extends FragmentActivity{

    CallbackManager callbackManager;
    FacebookController fbController;

    @Override
    public void onCreate(final Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

    fbController = FacebookController.getInstance(this);

    FacebookSdk.sdkInitialize(getApplicationContext());
    final LoginManager loginManager = LoginManager.getInstance();

    callbackManager = CallbackManager.Factory.create();
    loginManager.registerCallback(callbackManager, new FacebookCallback<LoginResult>() {
            @Override
            public void onSuccess(LoginResult loginResult) {
                String userId = loginResult.getAccessToken().getUserId();
                String token = loginResult.getAccessToken().getToken();
                Log.d("fb", "ID: " + userId + " Token: "+ token);
            }

            @Override
            public void onCancel() {
                finish();
            }

            @Override
            public void onError(FacebookException e) {
                Log.d("fb", "Exception: " + e.getMessage());
            }
        });
        loginManager.logInWithReadPermissions(this, Arrays.asList(new String[]{"email", "user_likes"}));
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        callbackManager.onActivityResult(requestCode, resultCode, data);
    }
}

Проблема в том, что это не работает, когда пользователь уже вошел в приложение Facebook на своем телефоне. В этом случае выдается ошибка «Пользователь вошел как другой пользователь Facebook». 

Я думаю, что, учитывая, что на устройстве уже есть активная учетная запись Facebook, создать новую невозможно. Но если это так, должен ли я получить идентификатор пользователя и токен из существующей учетной записи? Кажется, я не смог найти упоминаний об этой проблеме на страницах документации Facebook.

37
spacitron

Если вы хотите войти в систему с пользователем, который сейчас вошел в приложение Facebook, и у вас все еще есть токен, действительный для предыдущего пользователя, вы можете обнаружить ошибку и выйти из системы в FacebookCallback следующим образом:

    @Override
    public void onError(FacebookException e) {
        if (e instanceof FacebookAuthorizationException) {
            if (AccessToken.getCurrentAccessToken() != null) {
                LoginManager.getInstance().logOut();
            }
        }
    }

Затем вы можете войти снова, используя LoginManager.

67
sorianiv

Большое спасибо @sorianiv и @ ming-li за их ответы! Я хочу описать свой случай более подробно, потому что он может быть полезен для кого-то.

Facebook SDK создает файл общих настроек с именем «com.facebook.AccessTokenManager.SharedPreferences». А когда пользователь входит в Facebook SDK, он сохраняет токен доступа, имя пользователя и другую информацию о токене. Моя проблема была в том, что я не звонил 

LoginManager.getInstance().logOut() 

когда пользователь выходит из моего приложения. И кеш в общих настройках не очищался. Поэтому, когда пользователь пытается войти с другим пользователем Facebook, Facebook SDK получил данные пользователя из кэша и вернул ошибку: 

«Пользователь вошел как другой пользователь Facebook.»

В моем случае решение было просто вызвать logOut () когда пользователь выходит из моего приложения.

27
lobzik

Вы получите эту ошибку, если у вас уже есть действительный токен доступа, но вы запрашиваете дополнительные разрешения (через вызов LoginManager.logInWithReadPermissions), а пользователь, вошедший в приложение FB, отличается от того, для которого у вас уже есть токен доступа. Вы можете сделать пару вещей:

  1. Убедитесь, что у вас уже есть действительный токен доступа (AccessToken.getCurrentAccessToken ()! = Null), и не запрашивайте дополнительные разрешения.
  2. Если вам нужно запросить дополнительные разрешения, и вы получаете эту ошибку, попросите пользователя выйти из приложения FB и войти в систему как они сами.
4
Ming Li
if(LoginManager.getInstance()!=null){
        LoginManager.getInstance().logOut();
    }

Напишите перед "registerCallback ();" метод

1
Parth Desai

Я также столкнулся с той же проблемой сегодня. Я обошел проблему, используя приведенную ниже строку кода, когда пользователь нажимает на FbLoginButton

LoginManager.getInstance().logOut();

0
Ramesh 586