2012-02-08 49 views
3

我使用twitter4j創建了一個android應用程序。android twitter4j oauth在3g上不起作用

沒有任何api調用可以在3G上進行身份驗證,但在使用Wi-Fi時可以完美工作。 可能是什麼問題?

+0

我有這個確切的問題,奇怪:/ – brk3 2012-03-03 11:20:48

回答

4

我已經對此進行了廣泛的測試,可以確認這只是Android 4.0(ICS)設備上的一個問題。爲什麼,我還不確定,儘管HttpURLConnection的某些部分已經在4.0中進行了更改,所以其中一些更改使twitter4j不兼容。

我想這可能是這樣的: Android 4.0 ICS turning HttpURLConnection GET requests into POST requests

但分析使用tcpdump的要求,好像它實際上是做一個有效的GET後,但由於某些原因,Twitter的API還在說這是一個壞要求..

GET /1/users/show.json?include_entities=true&user_id=6842472 HTTP/1.1 
Authorization: OAuth oauth_consumer_key="<redacted>",oauth_signature_method="HMAC-SHA1",oauth_timestamp="1331150787",oauth_nonce="2157367237",oauth_version="1.0",oauth_token="<redacted>",oauth_signature="<redacted>" 
Accept-Encoding: gzip 
X-Twitter-Client-URL: http://twitter4j.org/en/twitter4j-2.2.5.xml 
User-Agent: twitter4j http://twitter4j.org/ /2.2.5 
X-Twitter-Client-Version: 2.2.5 
X-Twitter-Client: Twitter4J 
Host: api.twitter.com 
Connection: Keep-Alive 


HTTP/1.1 400 Bad Request 
Date: Wed, 07 Mar 2012 20:06:30 GMT  
Status: 400 Bad Request 
X-RateLimit-Class: api 
X-RateLimit-Reset: 1331153824 
X-Revision: DEV 
Last-Modified: Wed, 07 Mar 2012 20:06:30 GMT 
X-Frame-Options: SAMEORIGIN 
X-Transaction: a0bf805e990a5c79 
Content-Type: application/json; charset=utf-8 
X-RateLimit-Remaining: 0 
X-RateLimit-Limit: 150 
Pragma: no-cache 
Cache-Control: no-cache, no-store, must-revalidate, pre-check=0, post-check=0 
X-Runtime: 0.00742 
X-MID: 2295d07237fcb4763f7f54d2bf46e27dd40e022f 
Expires: Tue, 31 Mar 1981 05:00:00 GMT 
Vary: Accept-Encoding 
Server: tfe 
Transfer-Encoding: chunked 
Connection: close 
Content-Encoding: gzip 
Set-Cookie: 
... 

除非有人能找到它是什麼在ICS/HttpURLConnection的是打破這個我能看到的唯一的解決方法是寫twitter4j備用後端使用的HttpClient,而不是HttpURLConnection的,這正是我計劃去做。

編輯:所以我寫了一個客戶端後端爲twitter4j使用Apache HTTP客戶端,它遭受了完全相同的問題!一些更不眠時間和Wireshark已經給我帶來了以下非常方便的解決方案,實際工作:

初始化您twitter4j實例是這樣的:

ConfigurationBuilder configurationBuilder = new ConfigurationBuilder(); 
configurationBuilder.setOAuthConsumerKey(Const.CONSUMER_KEY); 
configurationBuilder.setOAuthConsumerSecret(Const.CONSUMER_SECRET); 
configurationBuilder.setUseSSL(true); 
Configuration configuration = configurationBuilder.build(); 
twitter = new TwitterFactory(configuration).getInstance(); 

的setUseSSL(真)是魔線。

+0

你是一個活的保護者,gj和你的努力的榮譽 – 2013-06-24 08:50:53