android–twitter4j 401身份验证错误持久存取AccessToken

android–twitter4j 401身份验证错误持久存取AccessToken,第1张

概述我正在努力弄清楚发生了什么.我有一个典型的应用程序结构,它产生一个负责获取Twitter令牌的OAuthActivity,然后我的主应用程序活动将该令牌用于各种与twitter相关的 *** 作.我的OAuthActivity有效.我得到一个身份验证令牌,Twitter网页正确显示我的应用程序名称等….此外,在该活动中,

我正在努力弄清楚发生了什么.我有一个典型的应用程序结构,它产生一个负责获取Twitter令牌的OAuthActivity,然后我的主应用程序活动将该令牌用于各种与twitter相关的 *** 作.

我的OAuthActivity有效.我得到一个身份验证令牌,Twitter网页正确显示我的应用程序名称等….此外,在该活动中,我可以发送推文并发布. .这意味着OAuthActivity工作,时钟同步,令牌有效等等……

但是当这个OAuthActivity完成并返回到调用活动时,每当我尝试使用该标记(从持久化的密钥/秘密重新创建它)时,无论什么 *** 作, *** 作总是会失败,并抱怨说AuthChallenge报告为null.就像我提供了一个空令牌,但我还没有!

请查看附件我的OAuthActivity的来源,以及我如何在主要活动中初始化Twitter对象的来源.如果你看错了,请告诉我.

PD – 我显然已经检查过我分配的令牌值与我得到的相同!还尝试了不同的方式来实例化Twitter,通过属性,通过构建器,通过集….并没有任何变化:(

编辑 – &GT我发现我必须在新的Twitter对象上调用“verifyCredentials()”,如果我想重用一个令牌,但是……没有运气! (请在最后找到发布的例外)

EDIT-2 – ;如果我同时使用子活动和父项

mTwitter=TwitterFactory.getSingleton()

然后twitter对象起作用,但这对我来说并不是真的可以接受,因为它不使用持久性,我需要每次都授权应用程序.此外,只有Twitter对象被授权,TwitterStream不断抛出异常.

干杯!

父活动的源代码,我尝试使用在子活动中获得的访问令牌,如下所示.无论我尝试使用此令牌,总是获得401.

private voID init_twitter(String tok, String sec) {    ConfigurationBuilder cb = new ConfigurationBuilder();    cb.setDeBUGEnabled(true)      .setoAuthConsumerKey(Conf.OAUTH_CONSUMER_KEY)      .setoAuthConsumerSecret(Conf.OAUTH_CONSUMER_SECRET)      .setoAuthAccesstoken(tok)      .setoAuthAccesstokenSecret(sec);    TwitterFactory tf = new TwitterFactory(cb.build());    mTwitter=tf.getInstance();    /** This always fails, even though I call this routine with the                 correct token & secret !!! See at the enf of message for an alternate                 routine like this one that makes use of verifyCredentials and                also fails. */     new Thread(new Runnable() {        @OverrIDe        public voID run() {            // Todo auto-generated method stub            try {                mTwitter.updateStatus("yello 2");            } catch (TwitterException e) {                // Todo auto-generated catch block                e.printstacktrace();            }        }}).start();}

孩子OAuthActivity的SOurce Code,显然是因为我获得了访问令牌&我能发推文:

import a lot;public class TwitterLogin extends Activity {    private final String TAG = "TwitterLogin";    public final static String PREF_KEY_OAUTH_TOKEN="twitter.oauth.token", PREF_KEY_OAUTH_SECRET="twitter.oauth.secret", PREF_KEY_TWITTER_LOGIN="twitter.oauth.login";    private SharedPreferences mPreferences;    private Twitter twitter = new TwitterFactory().getInstance();    @OverrIDe    public voID onCreate(Bundle savedInstanceState) {        Log.i(TAG, "Starting task to retrIEve request token.");        this.mPreferences = PreferenceManager.getDefaultSharedPreferences(this);        super.onCreate(savedInstanceState);        getActionbar().setTitle("TWITTER AUTHENTICATION");    }    private voID returnParent(boolean result)  {        setResult(result?Activity.RESulT_OK:Activity.RESulT_CANCELED, null);        if (Conf.LOG_ON) Log.d(TAG, "TWITTER AUTH: END PROCESS , GLOBAL RESulT "+result);        /** THE FolLOWING THING WORKS !!!!! IT SUCCESSFulLY TWEETS */        new Thread(new Runnable() {            @OverrIDe            public voID run() {                // Todo auto-generated method stub                try {                    twitter.updateStatus("yello");                } catch (TwitterException e) {                    // Todo auto-generated catch block                    e.printstacktrace();                }            }}).start();        finish();    }    /**     * Uses TWITTER4J to get the Request URL. It gets something like      * AUTH URL TWITTER4J IS http://API.twitter.com/oauth/authorize?oauth_token=xxxxxxxxxxxxxxxxxxxxx     *     * @return The Request URL to open in webvIEw and get the VerifIEr     */    private String oauth_twitter4j_getRequestUrl() throws TwitterException {        twitter.setoAuthConsumer(Constants.CONSUMER_KEY, Constants.CONSUMER_SECRET);        RequestToken tempToken = twitter.getoAuthRequestToken(Constants.OAUTH_CALLBACK_URL);        return tempToken.getAuthorizationURL();    }    @OverrIDe    protected voID onResume() {        super.onResume();        WebVIEw webvIEw = new WebVIEw(this);        webvIEw.getSettings().setJavaScriptEnabled(true);          webvIEw.setVisibility(VIEw.VISIBLE);        setContentVIEw(webvIEw);        Log.i(TAG, "RetrIEving request token from Google servers");        try {            StrictMode.ThreadPolicy policy = new StrictMode. ThreadPolicy.Builder().permitAll().build(); StrictMode.setThreadPolicy(policy);            String authorizationUrl=oauth_twitter4j_getRequestUrl();            Log.d(TAG, "AUTH URL TWITTER4J IS "+authorizationUrl_t);            webvIEw.setWebVIEwClIEnt(new WebVIEwClIEnt() {                  @OverrIDe                public boolean shouldOverrIDeUrlLoading(WebVIEw webVIEw, String url) {                     if (Conf.LOG_ON) Log.d(TAG,"WebVIEw: "+url);                    if (url != null && url.startsWith(Constants.OAUTH_CALLBACK_URL)) try {                        System.out.println("TWEET TWEET TWEET");                        retrIEveAccesstoken(url); //added this                        webVIEw.setVisibility(VIEw.GONE); //added this                        return true;                                } catch (Exception e) {                        e.printstacktrace();                        returnParent(false);                        return true;                    } else return false;                }                private voID saveAccesstoken(Accesstoken accesstoken) {                    // Shared Preferences                    Editor e = mPreferences.edit();                    // After getting access token, access token secret                    // store them in application preferences                    e.putString(PREF_KEY_OAUTH_TOKEN, accesstoken.getToken());                    e.putString(PREF_KEY_OAUTH_SECRET,accesstoken.getTokenSecret());                    e.putBoolean(PREF_KEY_TWITTER_LOGIN, true);                    e.commit();                     Log.e("Twitter OAuth Token", "> " + accesstoken.getToken()+"-"+accesstoken.getScreenname());                }                private voID retrIEveAccesstoken(String url) throws Exception {                    String requestToken  = extractParamFromUrl(url,"oauth_token");                    String verifIEr= extractParamFromUrl(url,"oauth_verifIEr");                    if (Conf.LOG_ON) Log.d(TAG, "Tenemos ACCESS TOKEN y VERIFIER :"+requestToken+","+verifIEr+","+(new Date().toString()));                    if (ONLY_TWITTER4J)                        retrIEveAccesstoken_with4j(verifIEr);                    else                        retrIEveAccesstoken_signpost(verifIEr);                }                private voID retrIEveAccesstoken_with4j(String verifIEr) throws TwitterException {                    Accesstoken a=twitter.getoAuthAccesstoken(verifIEr);                    saveAccesstoken(a);                    returnParent(true);                }                private String extractParamFromUrl(String url,String paramname) {                    String queryString = url.substring(url.indexOf("?", 0)+1,url.length());                    queryStringParser queryStringParser = new queryStringParser(queryString);                    return queryStringParser.getqueryParamValue(paramname);                }              });              webvIEw.loadUrl(authorizationUrl);          } catch (Exception ex) {            ex.printstacktrace();        }    }}

使用我确定正确的令牌调用VerifyCredentials时遇到的异常:

    Received authentication challenge is null    W/System.err(24915): Relevant discussions can be found on the Internet at:    W/System.err(24915):    http://www.Google.co.jp/search?q=6f0f59ca or    W/System.err(24915):    http://www.Google.co.jp/search?q=20d0f74e    W/System.err(24915): TwitterException{exceptionCode=[6f0f59ca-20d0f74e 1de2170b-f94dee38], statusCode=-1, message=null, code=-1, retryAfter=-1, ratelimitStatus=null, version=3.0.3}    W/System.err(24915):    at twitter4j.internal.http.httpClIEntImpl.request(httpClIEntImpl.java:192)    W/System.err(24915):    at twitter4j.internal.http.httpClIEntWrapper.request(httpClIEntWrapper.java:61)    W/System.err(24915):    at twitter4j.internal.http.httpClIEntWrapper.get(httpClIEntWrapper.java:89)    W/System.err(24915):    at twitter4j.TwitterBaseImpl.fillinIDAndScreenname(TwitterBaseImpl.java:126)    W/System.err(24915):    at twitter4j.TwitterImpl.verifyCredentials(TwitterImpl.java:592)    W/System.err(24915):    at com.regaliz.helpers.TwitterManager.run(TwitterManager.java:140)    W/System.err(24915):    at java.lang.Thread.run(Thread.java:856)    W/System.err(24915): Caused by: java.io.IOException: Received authentication challenge is null    W/System.err(24915):    at libcore.net.http.httpURLConnectionImpl.processAuthheader(httpURLConnectionImpl.java:397)    W/System.err(24915):    at libcore.net.http.httpURLConnectionImpl.processResponseheaders(httpURLConnectionImpl.java:345)    W/System.err(24915):    at libcore.net.http.httpURLConnectionImpl.getResponse(httpURLConnectionImpl.java:276)    W/System.err(24915):    at libcore.net.http.httpURLConnectionImpl.getResponseCode(httpURLConnectionImpl.java:479)    W/System.err(24915):    at twitter4j.internal.http.httpResponseImpl.<init>(httpResponseImpl.java:34)    W/System.err(24915):    at twitter4j.internal.http.httpClIEntImpl.request(httpClIEntImpl.java:156)    W/System.err(24915):    ... 6 more

这是为了使用verifyCredentials而修改的函数:

    private voID init_twitter_2(final String tok, final String sec) throws TwitterException {            ConfigurationBuilder cb = new ConfigurationBuilder();            cb.setDeBUGEnabled(true)              .setoAuthConsumerKey(Conf.OAUTH_CONSUMER_KEY)              .setoAuthConsumerSecret(Conf.OAUTH_CONSUMER_SECRET);    //        .setoAuthAccesstoken(tok)    //        .setoAuthAccesstokenSecret(sec);            TwitterFactory tf = new TwitterFactory(cb.build());            mTwitter=tf.getInstance();            Log.d(TAG, "init_twitter_2 "+tok+","+sec);            new Thread(new Runnable(){                @OverrIDe                public voID run() {                    // Todo auto-generated method stub                    User u;                    try {                        /** also trIEd setting token&secret like this, instead of in the builder-->no success */                        mTwitter.setoAuthAccesstoken(new Accesstoken(tok,sec));                        u = mTwitter.verifyCredentials();                        Log.d(TAG, "User: "+u.getname());                    } catch (TwitterException e) {                        // Todo auto-generated catch block                        e.printstacktrace();                    }                }}).start();        }

解决方法:

有愚蠢的人,愚蠢的人,愚蠢的人,然后就是我.一个星期以来,我一直在努力寻找代码,追踪Twitter4j,用curl复制oauths,怀疑垃圾收集活动,追踪DDMS,计算令牌上的哈希……只是发现我有2个Conf.OAUTH_CONSUMER_xxxxx实例不同的价值观

由于这些东西来自常数,名字相似,我没有意识到.

感叹 – 50个声望指向厕所!

总结

以上是内存溢出为你收集整理的android – twitter4j 401身份验证错误持久存取AccessToken全部内容,希望文章能够帮你解决android – twitter4j 401身份验证错误持久存取AccessToken所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1106705.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-28
下一篇 2022-05-28

发表评论

登录后才能评论

评论列表(0条)

保存