2010-09-15 117 views
1

任何人都可以在使用OAuth的Android + Twitter集成中请求帮助。Twitter + OAuth集成

我已经工作的http://github.com/brione/Brion-Learns-OAuth和得到以下列出的错误,当我张贴的状态更新...

WARN/System.err(190): org.apache.http.client.HttpResponseException: Unauthorized 
WARN/System.err(190):  at org.apache.http.impl.client.BasicResponseHandler.handleResponse(BasicResponseHandler.java:71) 
WARN/System.err(190):  at org.apache.http.impl.client.BasicResponseHandler.handleResponse(BasicResponseHandler.java:59) 
WARN/System.err(190):  at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:657) 
WARN/System.err(190):  at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:627) 
WARN/System.err(190):  at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:616) 
WARN/System.err(190):  at com.test.twitter.BLOA$PostTask.doInBackground(BLOA.java:343) 
WARN/System.err(190):  at com.test.twitter.BLOA$PostTask.doInBackground(BLOA.java:1) 
WARN/System.err(190):  at android.os.AsyncTask$2.call(AsyncTask.java:185) 
WARN/System.err(190):  at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:256) 
WARN/System.err(190):  at java.util.concurrent.FutureTask.run(FutureTask.java:122) 
WARN/System.err(190):  at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:648) 
WARN/System.err(190):  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:673) 
WARN/System.err(190):  at java.lang.Thread.run(Thread.java:1060) 

我与OAuth认证成功,并获得user_secret和user_token并存储在首选项...

所以这个问题是使用OAuth HTTP头发布...

和我的HTTP POST方法是:

private class PostTask extends AsyncTask<String, Void, JSONObject> { 

    ProgressDialog postDialog; 

    @Override 
    protected void onPreExecute() { 
    postDialog = ProgressDialog.show(BLOA.this, 
    getText(R.string.tweet_progress_title), 
    getText(R.string.tweet_progress_text), true, // indeterminate 
       // duration 
    false); // not cancel-able 
    } 

    @Override 
    protected JSONObject doInBackground(String... params) { 

    JSONObject jso = null; 
    try { 
    HttpPost post = new HttpPost(
     "http://twitter.com/statuses/update.json"); 
    LinkedList<BasicNameValuePair> out = new LinkedList<BasicNameValuePair>(); 
    out.add(new BasicNameValuePair("status", params[0])); 
    post.setEntity(new UrlEncodedFormEntity(out, HTTP.UTF_8)); 
    post.setParams(getParams()); 
    // sign the request to authenticate 
    mConsumer.sign(post); 
    String response = mClient.execute(post, 
     new BasicResponseHandler()); 
    jso = new JSONObject(response); 
    } catch (UnsupportedEncodingException e) { 
    e.printStackTrace(); 
    } catch (OAuthMessageSignerException e) { 
    e.printStackTrace(); 
    } catch (OAuthExpectationFailedException e) { 
    e.printStackTrace(); 
    } catch (OAuthCommunicationException e) { 
    e.printStackTrace(); 
    } catch (ClientProtocolException e) { 
    e.printStackTrace(); 
    } catch (IOException e) { 
    e.printStackTrace(); 
    } catch (JSONException e) { 
    e.printStackTrace(); 
    } finally { 

    } 
    return jso; 
    } 

    // This is in the UI thread, so we can mess with the UI 
    protected void onPostExecute(JSONObject jso) { 
    postDialog.dismiss(); 
    if (jso != null) { // authorization succeeded, the json object 
    // contains the user information 
    mEditor.setText(""); 
    mLast.setText(getCurrentTweet(jso)); 
    } else { 
    mLast.setText(getText(R.string.tweet_error)); 
    } 
    } 
} 
+0

新OAuth教程调用setParams(...)时是要覆盖PARAMS:http://goo.gl/99vpL – Blundell 2011-07-24 18:04:55

回答

1

请描述你所使用的客户端/消费/供应商,他们必须DefaultHttpClient/CommonsHttpOAuthConsumer/CommonsHttpOAuthProvider为确保正常工作。

确保您在致电此代码前致电consumer.setTokenWithSecret(oToken, oTokenSecret);

另外,post.getParams().setBooleanParameter(CoreProtocolPNames.USE_EXPECT_CONTINUE, false);是否存在于你的post-params?

什么原因使用空BasicResponseHandler,它不处理任何东西,它可以省略execute调用,我想。

而且,可能是一个愚蠢的问题,可能以后setEntity(...)

2

虽然您在onResume()中成功接收到user_secret和user_token,但您确定您的原始对象仍然相同吗?我在Android应用中遇到了这个问题。我会创建这些对象,但是当调用onResume()时,它是一个完全新的Activity实例,因为它在浏览器启动时从内存中释放。所以当我试图设置返回的秘密/令牌对时,它将不起作用。这种情况更可能发生在内存有限的设备上。有些人选择在呼叫之间坚持必要的信息,而其他人则决定不启动默认浏览器意图,而是主持嵌入式Web视图,以便其原始路标-oauth对象不会超出范围。

OAuth instance state in Android

不知道这是否是问题,但也许值得一试。

1

我有2个教程2个不同的Java库。 First one(日期)在这里,2nd one here与Scribe。它适用于LinkedIn,但切换到Twitter会非常容易。我会去#2

2

您需要使用post.addHeader()将oauth信息添加到http请求的标头中。要知道添加到页眉哪些事情,看看这里:http://dev.twitter.com/pages/auth

+0

我的代码上面写的..你可以请详细解释一下?或者给我一个例子? – 2010-09-25 12:12:09

+0

您正在使用路标库来简化使用OAuth协议的交互,因此不需要手动设置标题。请回答我的问题,我会尽力帮助你,我也在我的项目中使用路标库。 – 2010-09-25 16:08:00