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;
}
Essaye ça:
Init FacebookSdk.sdkInitialize()
dans le fragment onCreateView()
.
Prochaine ligne init callbackManager = CallbackManager.Factory.create()
;
Implémenter sur onActivityResult()
dans la classe Fragment.
Ajoutez votre callbackManager.onActivityResult(requestCode, resultCode, data);
in fragment onActivityResult()
.
Assurez-vous de retirer FacebookInit()
et callbackManager
de l'activité.
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.
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é.
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é.
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);
}
si dans le fragment c'est important loginButton.setFragment(this);
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()
.