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

}
}

Фрагмент:

 @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;
}
Комментарии к вопросу (5)
Решение

Попробуйте это:

  1. Инит FacebookSdk.sdkInitialize () в фрагменте&#39;onCreateView с()`.

  2. Следующая строка инициализации callbackManager = CallbackManager.Фабрика.создать()`;

  3. Выполнить по метод onActivityResult()` в классе фрагмента.

  4. Добавить callbackManager свой.метод onActivityResult(requestCode, resultCode, данных); в метод onActivityResult фрагмент ().

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

Комментарии (6)
loginButton.setFragment(this); 

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

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

Комментарии (3)

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

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

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

}

обновление: для 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() {
            @Override
            public void onSuccess(LoginResult loginResult) {
                // App code
            }

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

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

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

Вы Don'т нужна 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 или доля должны вперед `метод onActivityResult в callbackManager.

Комментарии (5)

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

Комментарии (0)

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

инициализация отзвонился менеджер

CallbackManager sCallbackManager = CallbackManager.Factory.create();

создать метод, чтобы зарегистрировать обратный вызов

private void configureFacebookAppInviteCallBack(){

    AppInviteDialog appInviteDialog = new AppInviteDialog(InviteHomeFragment.this);
                        appInviteDialog.registerCallback(sCallbackManager,
                                new FacebookCallback() {
                                    @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);
    }
Комментарии (0)

если в Фрагмент это loginButton важно.setFragment(этого);

Комментарии (0)

Я потратил ~3 часа, чтобы выяснить, у меня были непонимания с использованием API facebook.

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

        LoginManager.getInstance().registerCallback(callbackManager,
                new FacebookCallback() {
                    @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);
    }

Оригинал вызова не'т положить onsuccess процедуры()код в отдельную функциюcallAPI(), так это не вызов API, хотя уже при успешном логине. Причина в том, что сеанса в поле и перелогиниться не пойдет внутри onsuccess процедуры() !

Временное решение я нашел, это проверить маркер доступа и отдельный призыв к callAPI()в оба, onsuccess процедуры()иметод onActivityResult()`.

Комментарии (0)