Вход в Android Twitter не работает с Fabric SDK — обратный вызов не должен быть нулевым

Я работаю над функцией, которой требуется доступ к общедоступным данным пользователей Twitter через REST API Twitter, и я использую SDK Fabric SDK для входа в Twitter. Вот код моего Activity:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    supportRequestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);
    setContentView(R.layout.fragment_twitter_settings);
}

@Override
protected void onResume() {
    super.onResume();

    buttonAdd = (Button) findViewById(R.id.add);
    buttonLogin = (TwitterLoginButton) findViewById(R.id.login);

    TwitterSession session = Twitter.getSessionManager().getActiveSession();

    if(session == null)
    {
        login();
    }
    else
    {
        long userid = session.getUserId();
        logout(userid);
    }
}

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

@Override
public void onBackPressed() {
    super.onBackPressed();
    overridePendingTransition( R.anim.slide_in_right, R.anim.slide_out_right);
}

private void login(){
    buttonLogin.setText("Login");
    buttonLogin.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            v.post(new Runnable() {

                @Override
                public void run() {
                    doLogin();
                }
            });
        }
    });
}

private void logout(long userID){
    buttonLogin.setText("Logout");
    buttonLogin.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            v.post(new Runnable() {

                @Override
                public void run() {
                    doLogout();
                }
            });
        }
    });
}

private void doLogin(){

    buttonLogin.setCallback(new Callback<TwitterSession>() {
        @Override
        public void success(Result<TwitterSession> result) {
            // ... do something
        }

        @Override
        public void failure(TwitterException exception) {
            // ... do something
        }
    });
}

@SuppressLint("NewApi")
private void doLogout(){

    AlertDialog alertDialog;

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
        alertDialog = new AlertDialog.Builder(context,
                AlertDialog.THEME_HOLO_LIGHT).create();
    } else {
        alertDialog = new AlertDialog.Builder(context).create();
    }

    alertDialog.setTitle("Logout");
    alertDialog.setMessage("Are you sure ?");
    alertDialog.setIcon(R.drawable.twitter);

    alertDialog.setButton(AlertDialog.BUTTON_POSITIVE, "OK", new DialogInterface.OnClickListener() {

        @Override
        public void onClick(DialogInterface dialog, int which) {

             Twitter.getSessionManager().clearActiveSession();
        }
    });

    alertDialog.setButton(AlertDialog.BUTTON_NEGATIVE, "CANCEL", new DialogInterface.OnClickListener() {

        @Override
        public void onClick(DialogInterface dialog, int which) {
            // TODO Auto-generated method stub
            dialog.cancel();
        }
    });

    alertDialog.show();

}

Выполнив все инструкции здесь, я продолжаю получать следующее исключение, когда я нажмите на TwitterLoginButton:

FATAL EXCEPTION: main
java.lang.IllegalArgumentException: Callback must not be null.
at com.twitter.sdk.android.core.identity.TwitterAuthClient.authorize(TwitterAuthClient.java:67)
at com.twitter.sdk.android.core.identity.TwitterLoginButton$LoginClickListener.onClick(TwitterLoginButton.java:138)
at android.view.View.performClick(View.java:4438)
at android.view.View$PerformClick.run(View.java:18422)
at android.os.Handler.handleCallback(Handler.java:733)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:136)
at android.app.ActivityThread.main(ActivityThread.java:5017)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)

person Y.S    schedule 28.11.2014    source источник


Ответы (1)


Что ж, мы совершаем глупейшие ошибки. Объект Callback<TwitterSession> должен быть установлен ДО того, как пользователь нажмет на TwitterLoginButton. Добавьте следующий код в метод onCreate(), onActivityCreated() или onResume():

buttonLogin.setCallback(new Callback<TwitterSession>() {
    @Override
    public void success(Result<TwitterSession> result) {
        // ... do something
    }

    @Override
    public void failure(TwitterException exception) {
        // ... do something
    }
});

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

person Y.S    schedule 28.11.2014
comment
а как ты так поступил? - person sirvon; 14.01.2015
comment
Я пытался использовать ваш код с вашим редактированием, но когда я нажимаю кнопку, он продолжает обращаться к твиттеру за разрешением. Не могли бы вы помочь мне, пожалуйста? - person Figen Güngör; 23.01.2015
comment
пожалуйста, уточните, что вы имеете в виду, зайдя в Twitter для получения разрешения - person Y.S; 23.01.2015
comment
Страница разрешений в твиттере, которая спрашивает, должно ли ваше приложение использовать вашу учетную запись в твиттере? - person Figen Güngör; 26.01.2015
comment
Да так то правильно. Для входа в систему требуется разрешение пользователя. - person Y.S; 26.01.2015