Не удается получить токен доступа для Facebook SDK 4.8.1 для Android (ИЛИ) FacebookCallback не вызывается (ИЛИ) requestCode отличается в интеграции с Facebook

Я выполнил вход в Facebook для Android, чтобы интегрировать FB в свое приложение для Android. Сделано. Я вижу экран разрешений, на котором пользователь должен согласиться на использование своего идентификатора электронной почты. Проблема в том, что ни один из обратных вызовов FacebookCallback не вызывается.

Я выполнил ту же процедуру, что и в приведенном выше руководстве.

  • Я инициировал FB SDK.
  • Затем создал экземпляр CallBackManager.
  • Имейте setFragment (это).
  • Зарегистрировали обратный звонок на Facebook таким образом

Код фрагмента:

    public class MyFragment extends Fragment {
        @Override
        public void onCreate(Bundle savedInstanceState) {
            FacebookSdk.sdkInitialize(this.getActivity().getApplicationContext());
           super.onCreate(savedInstanceState);
        }  

        @Override
        public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
                mButtonFbLogin.setReadPermissions(Arrays.asList("email"));
            mButtonFbLogin.setFragment(this);

            mCallbackManager = CallbackManager.Factory.create();

            mButtonFbLogin.registerCallback(mCallbackManager, new FacebookCallback<LoginResult>() {
                @Override
                public void onSuccess(LoginResult loginResult) {
                    Log.d(TAG, "FB Login Successful. Token : " +loginResult.getAccessToken());
                }

                @Override
                public void onCancel() {
                    Log.d(TAG, "FB Login cancelled..");
                }

                @Override
                public void onError(FacebookException e) {
                    Log.d(TAG, "FB Login failed. Exception : " +e.toString());
                }
            });
       }   

       @Override
       public void onActivityResult(int requestCode, int resultCode, Intent data) {
            super.onActivityResult(requestCode, resultCode, data);
            Log.d(TAG, "onActivityResult of Fragment..");
            mCallbackManager.onActivityResult(requestCode, resultCode, data);

    }

}
  • Наконец я позвонил mCallbackManager.onActivityResult(requestCode, resultCode, data);. Моя активность onActivityResult () вызывается первой, откуда я вызвал onActivityResult () фрагмента.

Из журналов я вижу, что вызывается onActivityResult моего фрагмента, а также onActivityResult() callbackManger. Но ни один из обратных вызовов Facebook Callback не вызывается.

Есть подсказка?

AccessToken.getCurrentAccessToken() - это способ, который можно использовать в onCreate(). Но с этим я не могу точно знать, когда токен создается впервые.

И AccessTokenTracker на самом деле отслеживает изменения в токенах, но не знает, когда сеанс входа в систему успешен, неуспешен или отменен.

ОБНОВЛЕНИЕ:

Я просто пробовал использовать AccessTokenTracker, но onCurrentAccessTokenChanged () не был вызван после того, как я нажал OK на экране разрешений, и управление вернулось к моему фрагменту. Это код:

@Override public void onCreate (Bundle savedInstanceState) {FacebookSdk.sdkInitialize (this.getActivity (). GetApplicationContext ());

mAccessTokenTracker = new AccessTokenTracker() {
    @Override
    protected void onCurrentAccessTokenChanged(
            AccessToken oldAccessToken,
            AccessToken currentAccessToken) {
        Log.d(TAG, "onCurrentAccessTokenChanged : old : " +oldAccessToken);
        Log.d(TAG, "onCurrentAccessTokenChanged : new : " +currentAccessToken);
    }
};
mAccessTokenTracker.startTracking();

super.onCreate(savedInstanceState);

}


comment
опубликуйте свою активность и коды фрагментов, пожалуйста   -  person Heshan Sandeepa    schedule 04.01.2016
comment
@HeshanSandeepa, добавлен код фрагмента. У меня нет кода в Activity, но я вызвал onActivityResult () моего фрагмента из моего Activity. Это все в Activity.   -  person cgr    schedule 04.01.2016


Ответы (1)


У меня был MainActivity, содержащий MainFragment, который порождает CHildFragment. ChildFragment - это то место, где был добавлен LoginButton.

MainActivity -> MainFragment -> ChildFragment (LoginButton).

У меня был onActivityResult () в MainActivity и ChildFragment. В onActivityResult () MainActivity я явно вызвал childFragment.onActivityResult (), где я вызвал CallbackManager.onActivityResult (). Я установил фрагмент (это) в ChildFragment. Все в порядке, но ни один из обратных вызовов в FacebookCallback не был вызван.

Я попробовал несколько решений и отладил код Facebook и обнаружил, что requestCode, который они используют в качестве индекса для хранения отправленных нами обратных вызовов. Этот код отличался при сохранении обратного вызова и при его получении. Так что ничего не произошло.

В рамках отладки я переместил весь код в MainFragment, и он сработал. :-)

Итак, решение заключалось в том, чтобы переопределить onActivityResult () в MainFragment и оттуда вызвать onActivityResult () ChildFragment. ЭТО СРАБОТАЛО.

Итак, вывод состоит в том, что если вы поместите LoginButton в дочерний / вложенный фрагмент, sdk Facebook вызовет onActivityResult родительского фрагмента, но не onActivityResult () дочернего фрагмента или Activity.

person cgr    schedule 08.01.2016
comment
единственная причина, по которой facebook делает это, потому что контекст действия передается через фрагмент в facebookSDK. SDK facebook использует этот контекст для вызова обратного вызова. - person user2511882; 09.01.2016