web-dev-qa-db-fra.com

Utiliser Facebook SDK sur Android donne "Utilisateur connecté en tant qu'utilisateur Facebook différent". Erreur

Je suis en train de mettre à niveau le SDK de Facebook avec la dernière version. Le code suivant est très lisible ligne par ligne à partir des propres exemples de Facebook, disponibles ici: 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);
    }
}

Le problème est que cela ne fonctionne pas lorsque l'utilisateur s'est déjà connecté à l'application facebook sur son téléphone. Dans ce cas, cela donne l'erreur "Utilisateur connecté en tant qu'utilisateur différent de Facebook". 

Je pense qu’étant donné qu’il existe déjà un compte Facebook actif sur l’appareil, il est impossible d’en créer un nouveau. Mais si c'était le cas, devrais-je obtenir l'ID utilisateur et le jeton du compte existant? Je ne semblais pas pouvoir trouver aucune mention de ce problème sur les pages de documentation de Facebook.

37
spacitron

Si vous souhaitez vous connecter avec l'utilisateur qui est maintenant connecté à l'application Facebook et que vous disposez toujours d'un jeton valide pour un utilisateur précédent, vous pouvez détecter l'erreur et vous déconnecter de votre compte FacebookCallback de la manière suivante:

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

Ensuite, vous pouvez vous reconnecter à l’aide de LoginManager.

67
sorianiv

Merci beaucoup à @sorianiv et à @ ming-li pour leurs réponses! Je veux décrire mon cas avec plus de détails car cela peut être utile à quelqu'un.

Le kit de développement logiciel Facebook crée un fichier de préférences partagé appelé "com.facebook.AccessTokenManager.SharedPreferences". Et lorsque l'utilisateur se connecte avec facebook, le SDK stocke le jeton d'accès, le nom d'utilisateur et d'autres informations sur le jeton. Mon problème était que je n'ai pas appelé 

LoginManager.getInstance().logOut() 

lorsque l'utilisateur se déconnecte de mon application. Et le cache dans les préférences partagées n'était pas effacé. Ainsi, lorsqu'un utilisateur tente de se connecter à un autre utilisateur de Facebook, le SDK de Facebook récupère les données de l'utilisateur à partir du cache et renvoie une erreur: 

"Utilisateur connecté en tant qu'utilisateur différent de Facebook."

Dans mon cas, la solution consistait simplement à appeler logOut () lorsque l'utilisateur se déconnectait de mon application.

27
lobzik

Vous obtiendrez cette erreur si vous avez déjà un jeton d'accès valide, mais demandez des autorisations supplémentaires (via l'appel LoginManager.logInWithReadPermissions), et si l'utilisateur connecté à l'application FB est différent de celui pour lequel vous avez déjà un jeton d'accès. Vous pouvez faire quelques choses:

  1. Vérifiez que vous disposez déjà d'un jeton d'accès valide (AccessToken.getCurrentAccessToken ()! = Null) et ne demandez pas d'autres autorisations.
  2. Si vous avez besoin de demander plus d'autorisations et que vous obtenez cette erreur, demandez à l'utilisateur de se déconnecter de l'application FB et de se connecter en tant que tel.
4
Ming Li
if(LoginManager.getInstance()!=null){
        LoginManager.getInstance().logOut();
    }

Ecrivez avant "registerCallback ();" méthode

1
Parth Desai