Android的微博登录不工作与面料SDK - 回调不能为空 [英] Android Twitter login not working with Fabric SDK - Callback must not be null

查看:297
本文介绍了Android的微博登录不工作与面料SDK - 回调不能为空的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我工作的一个特点,需要通过Twitter的REST API来访问Twitter用户的公开数据,而我使用Twitter的面料SDK用于登录到Twitter的。这是我的活动的code:

  @覆盖
保护无效的onCreate(包savedInstanceState){
    super.onCreate(savedInstanceState);
    supportRequestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);
    的setContentView(R.layout.fragment_twitter_settings);
}

@覆盖
保护无效onResume(){
    super.onResume();

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

    TwitterSession会话= Twitter.getSessionManager()getActiveSession()函数。

    如果(会话== NULL)
    {
        登录();
    }
    其他
    {
        长的用户id = session.getUserId();
        注销(用户ID);
    }
}

@覆盖
公共无效onActivityResult(INT申请code,INT结果code,意图数据){
    super.onActivityResult(要求code,因此code,数据);
    btnLogin.onActivityResult(要求code,因此code,数据);
}

@覆盖
公共无效onBack pressed(){
    super.onBack pressed();
    overridePendingTransition(R.anim.slide_in_right,R.anim.slide_out_right);
}

私人无效的登录(){
    buttonLogin.setText(登录);
    buttonLogin.setOnClickListener(新OnClickListener(){

        @覆盖
        公共无效的onClick(视图v){
            v.post(新的Runnable(){

                @覆盖
                公共无效的run(){
                    doLogin();
                }
            });
        }
    });
}

私人无效注销(长的用户id){
    buttonLogin.setText(注销);
    buttonLogin.setOnClickListener(新OnClickListener(){

        @覆盖
        公共无效的onClick(视图v){
            v.post(新的Runnable(){

                @覆盖
                公共无效的run(){
                    doLogout();
                }
            });
        }
    });
}

私人无效doLogin(){

    buttonLogin.setCallback(新回拨< TwitterSession>(){
        @覆盖
        公共无效的成功(结果< TwitterSession>的结果){
            // ... 做一点事
        }

        @覆盖
        公共无效失败(TwitterException除外){
            // ... 做一点事
        }
    });
}

@燮pressLint(NewApi)
私人无效doLogout(){

    AlertDialog alertDialog;

    如果(Build.VERSION.SDK_INT> = Build.VERSION_ codeS.HONEYCOMB){
        alertDialog =新AlertDialog.Builder(背景下,
                AlertDialog.THEME_HOLO_LIGHT).create();
    } 其他 {
        alertDialog =新AlertDialog.Builder(上下文).create();
    }

    alertDialog.setTitle(注销);
    alertDialog.setMessage(你确定吗?);
    alertDialog.setIcon(R.drawable.twitter);

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

        @覆盖
        公共无效的onClick(DialogInterface对话,诠释它){

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

    alertDialog.setButton(AlertDialog.BUTTON_NEGATIVE,取消,新DialogInterface.OnClickListener(){

        @覆盖
        公共无效的onClick(DialogInterface对话,诠释它){
            // TODO自动生成方法存根
            dialog.cancel();
        }
    });

    alertDialog.show();

}
 

下面所有的指令后这里,我不断收到以下当我点击异常 TwitterLoginButton

 致命异常:主要
java.lang.IllegalArgumentException:如果回调不能为空。
在com.twitter.sdk.android.core.identity.TwitterAuthClient.authorize(TwitterAuthClient.java:67)
在com.twitter.sdk.android.core.identity.TwitterLoginButton$LoginClickListener.onClick(TwitterLoginButton.java:138)
在android.view.View.performClick(View.java:4438)
在android.view.View $ PerformClick.run(View.java:18422)
在android.os.Handler.handleCallback(Handler.java:733)
在android.os.Handler.dispatchMessage(Handler.java:95)
在android.os.Looper.loop(Looper.java:136)
在android.app.ActivityThread.main(ActivityThread.java:5017)
在java.lang.reflect.Method.invoke(本机方法)
在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:779)
在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
 

解决方案

好了,我们做的最愚蠢的错误。该回调< TwitterSession> 对象需要设置之前,用户点击 TwitterLoginButton 。添加以下code到你的的onCreate() onActivityCreated() onResume ()方法:

  buttonLogin.setCallback(新回拨< TwitterSession>(){
    @覆盖
    公共无效的成功(结果< TwitterSession>的结果){
        // ... 做一点事
    }

    @覆盖
    公共无效失败(TwitterException除外){
        // ... 做一点事
    }
});
 

这个错误是,我已经把这个code在Twitter的按钮点击监听器,这是不对的自然。您需要后置的按钮被按下,没有的之前,回调的 的。如何愚蠢明显,如何痛苦地自我贬低!

I'm working on a feature that needs to access the public data of Twitter users through the Twitter REST API, and I'm using Twitter's Fabric SDK for logging into Twitter. Here is the code of my 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();

}

After following all the instructions here, I keep getting the following exception when I click on the 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)

解决方案

Well, we make the stupidest mistakes. The Callback<TwitterSession> object needs to be set BEFORE the user clicks on the TwitterLoginButton. Add the following code to your onCreate() or onActivityCreated() or onResume() method:

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

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

The mistake was that I had put this code in the Twitter button click listener, which is wrong naturally. You need to set the callback before the button is clicked, not after. How stupidly obvious, and how painfully self-demeaning!

这篇关于Android的微博登录不工作与面料SDK - 回调不能为空的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆