Подтвердить что ты не робот

Facebook Войти CallbackManager FacebookCallback не называется?

  • Я пытаюсь войти в систему с LoginButton, но обратные вызовы входа не вызываются (LoginButton находится в фрагменте).
  • FacebookSdk.sdkInitialize вызывается в приложении onCreate
  • Вызов вызываемых вызовов не будет завершен. Вот код:

Активность:

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;
}
4b9b3361

Ответ 1

Попробуйте следующее:

  • Init FacebookSdk.sdkInitialize() в фрагменте onCreateView().

  • Следующая строка init callbackManager = CallbackManager.Factory.create();

  • Реализовать на onActivityResult() в классе Фрагмент.

  • Добавьте свой callbackManager.onActivityResult(requestCode, resultCode, data); в фрагменте onActivityResult().

Убедитесь, что из активности удалены FacebookInit() и callbackManager.

Ответ 2

для более старых версий:

измените метод, как показано ниже:

 @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: для v2.3, здесь:

Вы добавляете обратный вызов к своей активности или фрагменту метода onCreate():

@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   
            }
});
}

Если вход успешно завершен, параметр LoginResult имеет новый AccessToken и самые последние предоставленные или отклоненные разрешения.

Вам не нужно, чтобы registerCallback для успешного входа в систему, вы можете выбрать текущие изменения токена доступа с классом AccessTokenTracker, описанным ниже.

Затем в onActivityResult() переслать результаты входа в callbackManager, созданные в onCreate():

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

Каждое действие и фрагмент, которые вы интегрируете с FacebookSDK Login или Share, должны перенаправлять onActivityResult в callbackManager.

Ответ 3

loginButton.setFragment(this); 

Эта строка уже находится в вопросе. Но просто хотел написать это для любых других разработчиков, которые смотрят.

Если вы используете кнопку входа FB в фрагмент, убедитесь, что вы добавили это в свой метод onCreateView. Это обеспечивает обратный вызов, чтобы перейти к фрагменту, а не к вашей активности.

Ответ 4

Также учтите, что если у вас есть два менеджера обратного вызова для двух разных операций (например, вход в систему и общий доступ), первый, который получает onActivityResult, может получить второй обратный вызов и наоборот. Это поведение также может привести к тому, что ваш callback не будет вызван.

Ответ 5

Это сработало для меня

Инициализировать диспетчер обратного вызова

CallbackManager sCallbackManager = CallbackManager.Factory.create();

Создать метод регистрации обратного вызова

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");
                                        }
                                    }
                                });


}

Внедрить 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);
    }