Не може да се получи Access Token за Facebook SDK 4.8.1 за Android (ИЛИ) FacebookCallback не се извиква (ИЛИ) requestCode е различен при интегрирането на Facebook

Следвах влизане във Facebook за Android, за да интегрирам FB в моето приложение за Android. Това е направено. Виждам екрана за разрешение, където потребителят трябва да приеме да използва своя имейл адрес. Проблемът е, че нито едно от обратните извиквания на FacebookCallback не се извиква.

Следвах същата процедура, спомената в горния урок.

  • Стартирах FB SDK.
  • След това създаде екземпляр на CallBackManager.
  • Имате setFragment(this).
  • Регистриран FacebookCallback callabck по този начин

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

    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. Това е всичко в Дейност.   -  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(). Направих setFragment(this) в ChildFragment. Всичко е наред, но нито едно от обратните повиквания във FacebookCallback не беше извикано.

Опитах множество решения и също отстраних грешки в кода на Facebook и открих, че requestCode, който те използват като индекс за съхраняване на обратно извикване, изпратихме. Този код беше различен, докато съхраняваше обратното извикване и докато го извличаше. Така че нищо не се случи.

Част от debuggin, преместих пълния код в MainFragment и той проработи. :-)

И така, решението беше да се замени onActivityResult() в MainFragment и да се извика onActivityResult() на ChildFragment от там. ПРОРАБОТИ.

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

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