web-dev-qa-db-fra.com

Connexion Facebook CallbackManager FacebookCallback non appelé?

  • J'essaie de me connecter avec LoginButton mais les rappels de connexion ne sont pas appelés (LoginButton est dans un fragment). 
  • FacebookSdk.sdkInitialize est appelée dans l'application onCreate
  • Aucun rappel n'est appelé après la connexion est terminée . Voici le code:

Activité:

public class FrameActivity extends BaseActivity {

 public static CallbackManager callbackManager;
@Override
protected void onCreate(Bundle savedInstanceState) {
// FacebookSdk.sdkInitialize is called in the Application onCreate

callbackManager = CallbackManager.Factory.create();
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    callbackManager.onActivityResult(requestCode, resultCode, data);

}
}

Fragment:

 @Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    // Inflate the layout for this fragment
    View view = inflater.inflate(R.layout.fragment_login, container, false);
    LoginButton loginButton = (LoginButton) view.findViewById(R.id.login_button);
    loginButton.setReadPermissions("user_friends");
    loginButton.setReadPermissions("public_profile");
    loginButton.setReadPermissions("email");
    loginButton.setReadPermissions("user_birthday");
    // If using in a fragment
    loginButton.setFragment(this);
    // Other app specific specialization

    // Callback registration
    loginButton.registerCallback(FrameActivity.callbackManager, new FacebookCallback<LoginResult>() {
        @Override
        public void onSuccess(LoginResult loginResult) {


}
        @Override
        public void onCancel() {
            // App code

        }

        @Override
        public void onError(FacebookException exception) {
            // App code

        }
    });
    return view;
}
28

Essaye ça:

  1. Init FacebookSdk.sdkInitialize() dans le fragment onCreateView().

  2. Prochaine ligne init callbackManager = CallbackManager.Factory.create();

  3. Implémenter sur onActivityResult() dans la classe Fragment.

  4. Ajoutez votre callbackManager.onActivityResult(requestCode, resultCode, data);in fragment onActivityResult().

Assurez-vous de retirer FacebookInit() et callbackManager de l'activité.

49
Raghu Rami Reddy

pour les anciennes versions:

changer la méthode comme ci-dessous:

 @Override
 public void onActivityResult(int requestCode, int resultCode, Intent data)
 {
    super.onActivityResult(requestCode, resultCode, data);
    if (resultCode == RESULT_OK)
    {

        com.facebook.Session.getActiveSession().onActivityResult(this, requestCode, resultCode, data);
    }
    else
    {
        com.facebook.Session.getActiveSession().closeAndClearTokenInformation();
    }

}

UPDATE: pour la v2.3, à partir de ici :

Vous ajoutez le rappel à votre activité ou à la méthode onCreate () de votre fragment:

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
FacebookSdk.sdkInitialize(this.getApplicationContext());

callbackManager = CallbackManager.Factory.create();

LoginManager.getInstance().registerCallback(callbackManager,
        new FacebookCallback<LoginResult>() {
            @Override
            public void onSuccess(LoginResult loginResult) {
                // App code
            }

            @Override
            public void onCancel() {
                 // App code
            }

            @Override
            public void onError(FacebookException exception) {
                 // App code   
            }
});
}

Si la connexion aboutit, le paramètre LoginResult a la nouvelle AccessToken et les dernières autorisations accordées ou refusées.

Vous n'avez pas besoin d'un registerCallback pour que la connexion aboutisse, vous pouvez choisir de suivre les modifications actuelles du jeton d'accès avec la classe AccessTokenTracker décrite ci-dessous.

Ensuite, dans onActivityResult(), transmettez les résultats de la connexion à la callbackManager créée dans onCreate():

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

Toutes les activités et tous les fragments que vous intégrez à FacebookSDK Login ou Share doivent transmettre onActivityResult au callbackManager.

10
user4670319
loginButton.setFragment(this); 

Cette ligne est déjà dans la question. Mais je voulais juste écrire ceci pour tous les autres développeurs qui regardent.

Si vous utilisez le bouton de connexion FB dans un fragment, veillez à l'ajouter à votre méthode onCreateView. Cela garantit le rappel de passer à Fragment plutôt que d'aller à votre activité.

10
Prakash

Notez également que si vous avez deux gestionnaires de rappel pour deux opérations différentes (comme la connexion et le partage), le premier qui reçoit onActivityResult peut recevoir le rappel du second et vice-versa. Ce comportement peut également empêcher votre rappel d'être appelé.

2
Eli Kohen

Cela a fonctionné pour moi

Initialiser le gestionnaire de rappel

CallbackManager sCallbackManager = CallbackManager.Factory.create();

Créer une méthode pour enregistrer un rappel

private void configureFacebookAppInviteCallBack(){

    AppInviteDialog appInviteDialog = new AppInviteDialog(InviteHomeFragment.this);
                        appInviteDialog.registerCallback(sCallbackManager,
                                new FacebookCallback<AppInviteDialog.Result>() {
                                    @Override
                                    public void onSuccess(AppInviteDialog.Result result) {
                                        Log.d("rht", "Invitation Sent Successfully");
                                        CommonUtils.getInstance().showToast("50");
                                    }

                                    @Override
                                    public void onCancel() {
                                        Log.d("rht", "Error Occured in facebook invite ");
                                    }

                                    @Override
                                    public void onError(FacebookException e) {
                                        if(e!=null) {
                                            Log.d("rht", "Error Occured in facebook invite ");
                                        }else{
                                            Log.d("rht", "Error Occured in facebook invite");
                                        }
                                    }
                                });


}

Implémentez onActivityResult.

@Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        Log.v("rht", "onActivityResult called requestCode "+requestCode+" resultCode "+resultCode);

        sCallbackManager.onActivityResult(requestCode, resultCode, data);
    }
1
Rohit Mandiwal

si dans le fragment c'est important loginButton.setFragment(this); 

0
Ashish Chaugule

J'ai passé environ 3 heures à comprendre que j'avais mal compris l'utilisation de l'API de Facebook.

    void someInitCode() {
        callbackManager = CallbackManager.Factory.create();

        LoginManager.getInstance().registerCallback(callbackManager,
                new FacebookCallback<LoginResult>() {
                    @Override
                    public void onSuccess(LoginResult loginResult) {
                        callAPI();
                    }
                    @Override
                    public void onCancel() {
                    }

                    @Override
                    public void onError(FacebookException exception) {
                    }

                });

}
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (resultCode == RESULT_OK) {
            if (AccessToken.getCurrentAccessToken() != null) callAPI();
            else callbackManager.onActivityResult(requestCode, resultCode, data);
        } else {
            Log.d("hole", "not ok");
        }
        super.onActivityResult(requestCode, resultCode, data);
    }

L'appel d'origine n'a pas mis le code onSuccess() dans la fonction séparée callAPI(), aussi n'appelle-t-il jamais l'API même si la connexion a déjà abouti. La raison en est que la connexion et la reconnexion ne vont pas dans onSuccess()!

La solution de rechange que j'ai trouvée est de vérifier le jeton d'accès et de séparer l'appel à callAPI() dans onSuccess() et onActivityResult().

0
林果皞