Facebook Вход не возвращается Пользователь access_token

Это мой первый пост, поэтому, пожалуйста, дайте мне знать, если я не соблюдаю правила сообщества.

Теперь к проблеме! Я пытался настроить процесс входа в Facebook для приложения, и я дошел до добавления элемента GUI (встроенная кнопка входа в Facebook), и когда кнопка запускается и запрашивает пользователя / пароль, предоставление приложению доступа к учетной записи пользователя. Проблема, с которой я сталкиваюсь, заключается в том, что при использовании следующего кода для получения значения обратного вызова из приложения я ничего не получаю (значение не печатается). Прямо сейчас я печатаю в LogCat произвольные значения, однако, как только печать работает, я обращаюсь к пользователю access_token и другой информации (которая изначально не работала). Любая помощь приветствуется!

protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_connect_accounts);

            Log.i("fromMe", "test1");
            FacebookSdk.sdkInitialize(this.getApplicationContext());
            callbackManager = CallbackManager.Factory.create();
            LoginButton loginButton = (LoginButton)findViewById(R.id.login_button);
            loginButton.registerCallback(callbackManager, new   FacebookCallback<LoginResult>(){

                public void onSuccess(LoginResult loginResult) {
                    Log.i("fromMe", "1");
                }

                public void onCancel() {
                    Log.i("fromMe", "2");
                }

                public void onError(FacebookException exception) {
                    Log.i("fromMe", "3");
                }
            });
        }

3 ответа

Решение

Если Log.i("fromMe", "1");работать, чтобы вы могли позвонить:

AccessToken accessToken = loginResult.getAccessToken(); 

в вашем onSuccess(),

И в onActivityResult(int requestCode, int resultCode, Intent data)добавлять:

super.onActivityResult(requestCode, resultCode, data); 
callbackManager.onActivityResult(requestCode, resultCode, data);

Я никогда не использовал встроенную кнопку facebook, вместо этого я использовал обычную кнопку с щелчком слушателя. и я называю этот метод в onClick(),

 myButton.setOnClickListener(new View.OnClickListener(){
    @Override
    public void onClick(View v){
        //Starting facebook signIN
        startFbSignIn();
    }
});

startFbSignIn();

private void startFbSignIn() {

        List<String> permissions = new ArrayList<>();
        permissions.add("email");

        Session.openActiveSession(this, true, permissions, new Session.StatusCallback() {
            @Override
            public void call(final Session session, SessionState sessionState, Exception e) {

                Log.d("X", "Call Called");

                if (session.isOpened()) {

                    Log.d("X", "SessionOpened" + session.getAccessToken());

                    //Showing some loading


                    Request.newMeRequest(session, new Request.GraphUserCallback() {
                        @Override
                        public void onCompleted(GraphUser graphUser, Response response) {

                            //FACEBOOOK SIGNIN SUCCESS
                            Log.i("X", "Facebook Login Success");
                            //Log
                            Log.d("X", "GRAPH USER:" + graphUser.toString());


                            String name = graphUser.getName();
                            //.....

                        }
                    }).executeAsync();

                } else {
                    Log.d("X", "SessioNOTopened");
                }

            }
        });

    }

Вышеуказанный метод успешно работает для меня и вашего onActivityResult() должен выглядеть примерно так

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

    //Facebook Session Manager
    Session.getActiveSession().onActivityResult(this, requestCode, resultCode, data);
}

Вероятно, из-за ошибки в SDK facebook вы не можете получить accessToken напрямую. Нам нужно создать трекер accessToken, а затем получить accessToken

    private AccessTokenTracker accessTokenTracker; 
    accessTokenTracker = new AccessTokenTracker() {


        @Override
        protected void onCurrentAccessTokenChanged(AccessToken oldAccessToken, AccessToken newAccessToken) {
            try {

                if (newAccessToken.getToken() != null) {
                    facebookAccessToken = newAccessToken.getToken();
                    //this is your accessToken here

                }
                else if (oldAccessToken.getToken() != null) {
                    facebookAccessToken = oldAccessToken.getToken();
                     //this is your accessToken here
                }else {
                    Toast.makeText(getBaseContext(), "Facebook Login Failed", Toast.LENGTH_LONG).show();
                }

                if(oldAccessToken.getToken()!=null)
                Log.e("old", oldAccessToken.getToken());
            }catch (Exception e){
                e.printStackTrace();
            }

        }
    };

как только это будет успешно сделано, переопределите метод onStop действия и убедитесь, что вы остановили accessToken там.

    accessTokenTracker.stopTracking();