我正在努力弄清楚发生了什么.我有一个典型的应用程序结构,它产生一个负责获取Twitter令牌的OAuthActivity,然后我的主应用程序活动将该令牌用于各种与twitter相关的 *** 作.
我的OAuthActivity有效.我得到一个身份验证令牌,Twitter网页正确显示我的应用程序名称等….此外,在该活动中,我可以发送推文并发布. .这意味着OAuthActivity工作,时钟同步,令牌有效等等……
但是当这个OAuthActivity完成并返回到调用活动时,每当我尝试使用该标记(从持久化的密钥/秘密重新创建它)时,无论什么 *** 作, *** 作总是会失败,并抱怨说AuthChallenge报告为null.就像我提供了一个空令牌,但我还没有!
请查看附件我的OAuthActivity的来源,以及我如何在主要活动中初始化Twitter对象的来源.如果你看错了,请告诉我.
PD – 我显然已经检查过我分配的令牌值与我得到的相同!还尝试了不同的方式来实例化Twitter,通过属性,通过构建器,通过集….并没有任何变化:(
编辑 – >我发现我必须在新的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所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)