2012-02-08 1 views
3

Я создал приложение для Android с помощью twitter4j.android twitter4j oauth не работает, когда на 3g

Ни один из вызовов api не может аутентифицироваться, когда на 3g, но работает отлично, когда на wi-fi. В чем может быть проблема?

+0

У меня есть эта точная проблема, причудливая:/ – brk3

ответ

4

Я тестировал это широко и могу подтвердить, что это только проблема на устройствах Android 4.0 (ICS). Почему, я еще не уверен, хотя некоторые части HttpURLConnection изменились в 4.0, поэтому некоторые из этих изменений сделали twitter4j несовместимым.

Я думал, что это, возможно, было это: Android 4.0 ICS turning HttpURLConnection GET requests into POST requests

, но после анализа запросов с ТСРйитром кажется, что это на самом деле, сделать правильный GET, но по какой-то причине, щебет апи еще говорит, что это плохо запрос ..

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, что именно то, что Я планирую это сделать.

EDIT: Итак, я написал клиентский бэкэнд для twitter4j, который использует apache httpclient, и он страдает от той же самой проблемы !! Некоторые более бессонные часы и 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 и kudos для ваших усилий –