Facebook AccessToken.getAccessToken имеет значение null при открытии приложения даже после первого входа

У меня встроен последний sdk для Android android (Sdk 4.0). Это код, который я добавил в свой метод onCreate.

FacebookSdk.sdkInitialize(this.getApplicationContext());
            callbackManager = CallbackManager.Factory.create();
            if(AccessToken.getCurrentAccessToken()!=null){
                Log.d(FBTAG,"facebook already logged in");
                isFBLogin = true;
            }
            LoginManager.getInstance().registerCallback(callbackManager,
                    new FacebookCallback<LoginResult>() {
                        @Override
                        public void onSuccess(LoginResult loginResult) {
                            // App code
                            Log.d(FBTAG,"facebook log in");
                            isFBLogin = true;
                        }

                        @Override
                        public void onCancel() {
                             // App code
                            isFBLogin = false;
                        }

                        @Override
                        public void onError(FacebookException error) {
                            isFBLogin = false;
                            Log.d(FBTAG,"facebook login error: "+error);
                            // App code

                        }
            });

И это код, который я использовал для onClickLogin

public void onClickLogin() {
        LoginManager.getInstance().logInWithPublishPermissions(this, PERMISSIONS);
    }

Я могу войти в систему, нажав кнопку входа в систему и обработав функцию onClickLogin. Теперь, в следующий раз, когда я открываю приложение, приложение, которое я проверяю для AccessToken.getAccessToken, чтобы проверить, не был ли пользователь уже зарегистрирован в facebook, но он всегда приходит как null. В любом случае, в новом sdk нет входа в фоновом режиме, поэтому мне не нужно просить пользователя войти в систему всегда, как раньше, в предыдущей версии в классе сеанса.

Ответ 1

Маркер доступа, который был возвращен LoginManager, будет сохранен в общих настройках, поэтому при следующем открытии приложения AccessToken.getCurrentAccessToken() должен иметь тот же токен доступа, это то же самое, что и с сеансом класс. Вы можете проверить образцы, предоставленные с SDK, чтобы увидеть, как они работают.

Убедитесь, что вы не переустанавливаете приложение между сеансами или не устанавливаете токен текущего доступа в явном виде.

Ответ 2

Вы также можете добавить InitializeCallback в sdkInitialize и проверить AccessToken внутри обратного вызова:

FacebookSdk.sdkInitialize(getApplicationContext(), new FacebookSdk.InitializeCallback() {
        @Override
        public void onInitialized() {
            if(AccessToken.getCurrentAccessToken() == null){
                System.out.println("not logged in yet");
            } else {
                System.out.println("Logged in");
            }
        }
    });

Ответ 3

Инициализация sdk для Android Android занимает некоторое время. Инициализация. поэтому вам нужно подождать всего 100 миллисекунд, прежде чем вызывать AccessToken.getCurrentAccessToken()

как только попробуй это решение, оно работает для меня::

        FacebookSdk.sdkInitialize(this.getApplicationContext());
    callbackManager = CallbackManager.Factory.create();

    new Handler().postDelayed(new Runnable() {
        @Override
        public void run() {


            if (AccessToken.getCurrentAccessToken() != null) {
                Log.d(FBTAG, "facebook already logged in");
                isFBLogin = true;
            }
            LoginManager.getInstance().registerCallback(callbackManager,
                    new FacebookCallback<LoginResult>() {
                        @Override
                        public void onSuccess(LoginResult loginResult) {
                            // App code
                            Log.d(FBTAG, "facebook log in");
                            isFBLogin = true;
                        }

                        @Override
                        public void onCancel() {
                            // App code
                            isFBLogin = false;
                        }

                        @Override
                        public void onError(FacebookException error) {
                            isFBLogin = false;
                            Log.d(FBTAG, "facebook login error: " + error);
                            // App code

                        }
                    });


        }
    }, 100);

Ответ 4

Добавьте следующий код:

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

Ответ 5

Я не тестировал это сам, но я думаю, что вы можете сделать это, чтобы получить AccessToken из объекта LoginResult в методе onSuccess обратного вызова.

Итак: AccessToken accessToken = loginResult.getAccessToken();

Затем вы сохраните этот accessToken, сказав:

AccessToken.setAccessToken(маркер доступа);

Затем, когда вы вызываете AccessToken.getAccessToken, он должен вернуть сохраненный вами доступ.

Ответ 6

Причина - кэширование профиля в формате SDK.

    AccessToken.setCurrentAccessToken(null); 
    Profile.setCurrentProfile(null);

Прежде чем уничтожить активность, попробуйте. Возможно, это может решить вашу проблему. В первый раз работая, это чистый кэш во второй раз, когда вы можете войти в другую учетную запись.

Ответ 7

1.Используйте эту функцию для этой функции

public void onClickLogin() {
    LoginManager.getInstance().logInWithReadPermissions(activity_name.this, PERMISSIONS);
}

Ответ 8

Шаги

1) FacebookSdk.sdkInitialize(getActivity(). getApplicationContext());

2) CallbackManager mCallbackManager = CallbackManager.Factory.create();

    LoginManager.getInstance().registerCallback(mCallbackManager,
            new FacebookCallback<LoginResult>() {

                @Override
                public void onSuccess(LoginResult loginResult) {
                    //you will get access token here
                    mAccessToken = loginResult.getAccessToken();



                }

                @Override
                public void onCancel() {

                }

                @Override
                public void onError(FacebookException error) {

                }
            });

3) // после этого получить токен доступа, используя AccessToken mAccessToken = AccessToken.getCurrentAccessToken();

Убедитесь, что если вы используете логин facebook из фрагмента,

1) убедитесь, что вы вызываете super.onActivityResult() в фрагменте с помощью менеджера обратного вызова Facebook.

2) проверьте, что super.onActivityResult() вызывается в связанной "активности фрагмента", если вы переопределяете onActivityResult в связанной деятельности.