Использование 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.
Ответы
Ответ 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();