java - Android Twitter 登录不适用于 Fabric SDK - 回调不能为空

标签 java android twitter twitter-oauth twitter-fabric

我正在开发一项功能,需要通过 Twitter REST API 访问 Twitter 用户的公共(public)数据,并且我正在使用 Twitter 的 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();

}

按照所有说明操作后 here ,当我点击 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)

最佳答案

嗯,我们犯了最愚蠢的错误。 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
    }
});

错误是我把这段代码放在了推特按钮点击监听器中,这自然是错误的。您需要在单击按钮之前设置回调,而不是之后

关于java - Android Twitter 登录不适用于 Fabric SDK - 回调不能为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27184070/

相关文章:

java - Map<String, Integer> 和 Map<Integer ,String> 排序

java - 由 : java. 引起 lang.ClassNotFoundException: 没有找到类 "com.google.android.gms.common.internal.zzbq"

java - Gradle 问题 - 错误 :Execution failed for task

AndroidX 突然导致 NativeScript 构建失败

java - Twitter 数据的图形可视化 - 使用处理 Java

ios - 滚动 tableview 后加载更多数据( Objective-C )

java - Android Studio 4.1 调试器断点不起作用

android - 如何使用代码进行联系人备份?

android - Android 软键盘的自定义输入类型/键集

javascript - 如何在 Shiny 应用程序中嵌入 Twitter 时间线