Ich aktualisiere meine Verwendung des Facebook SDK auf die neueste Version. Der folgende Code wird von Zeile zu Zeile aus den eigenen Beispielen von Facebook angehoben, die hier zu finden sind: 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);
}
}
Das Problem ist, dass dies nicht funktioniert, wenn der Benutzer sich bereits auf seinem Telefon bei der Facebook-App angemeldet hat. In diesem Fall wird der Fehler "Benutzer als anderer Facebook-Benutzer angemeldet" angezeigt.
Ich denke, da auf dem Gerät bereits ein aktiver Facebook-Account vorhanden ist, kann kein neuer erstellt werden. Wenn dies der Fall war, sollte ich dann die ID und das Token des Benutzers vom vorhandenen Konto abrufen? Ich konnte anscheinend keine Erwähnung dieses Problems auf den Dokumentationsseiten von Facebook finden.
Wenn Sie sich mit dem Benutzer anmelden möchten, der jetzt in der Facebook-App angemeldet ist, und Sie noch über ein für einen früheren Benutzer gültiges Token verfügen, können Sie den Fehler erkennen und sich in Ihrem FacebookCallback wie folgt abmelden:
@Override
public void onError(FacebookException e) {
if (e instanceof FacebookAuthorizationException) {
if (AccessToken.getCurrentAccessToken() != null) {
LoginManager.getInstance().logOut();
}
}
}
Dann können Sie sich erneut mit dem LoginManager anmelden.
Vielen Dank an @sorianiv und @ ming-li für ihre Antworten! Ich möchte meinen Fall ausführlicher beschreiben, da er für jemanden hilfreich sein kann.
Das Facebook SDK erstellt eine freigegebene Voreinstellungsdatei mit dem Namen "com.facebook.AccessTokenManager.SharedPreferences". Und wenn sich der Benutzer bei Facebook anmeldet, speichert SDK dort Zugriffstoken, Benutzernamen und andere Tokeninformationen. Mein Problem war, dass ich nicht angerufen habe
LoginManager.getInstance().logOut()
wenn sich der Benutzer in meiner App abmeldet. Der Cache in den gemeinsamen Einstellungen wurde nicht gelöscht. Wenn der Benutzer dann versucht, sich bei einem anderen Facebook-Benutzer anzumelden, hat Facebook SDK die Benutzerdaten aus dem Cache abgerufen und einen Fehler zurückgegeben:
"Benutzer als anderer Facebook-Benutzer angemeldet."
In meinem Fall bestand die Lösung darin, logOut () aufzurufen, wenn sich der Benutzer von meiner App abmeldet.
Sie erhalten diese Fehlermeldung, wenn Sie bereits über ein gültiges Zugriffstoken verfügen, jedoch zusätzliche Berechtigungen anfordern (über den Aufruf LoginManager.logInWithReadPermissions), und der in der FB-App angemeldete Benutzer unterscheidet sich von dem, für den Sie bereits ein Zugriffstoken haben. Sie können ein paar Dinge tun:
if(LoginManager.getInstance()!=null){
LoginManager.getInstance().logOut();
}
Schreiben Sie vor "registerCallback ();" Methode
Ich hatte heute auch das gleiche Problem. Ich habe das Problem durch die Verwendung der folgenden Codezeile überwunden, wenn der Benutzer auf FbLoginButton klickt
LoginManager.getInstance().logOut();