Подтвердить что ты не робот

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

Я обновляю свое использование SDK для Facebook до последней версии. Следующий код prety многократно поднимается по строкам из собственных примеров 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.

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

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

LoginManager.getInstance().logOut() 

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

"Пользователь зарегистрировался как другой пользователь Facebook".

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

Ответ 3

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

  • Убедитесь, что у вас уже есть действительный токен доступа (AccessToken.getCurrentAccessToken()!= null) и не запрашивайте больше разрешений.
  • Если вам нужно запросить дополнительные разрешения, и вы получите эту ошибку, попросите пользователя выйти из приложения FB и войти в систему как самостоятельно.

Ответ 4

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

LoginManager.getInstance().logOut();