1

任何人都可以使用 OAuth 在 Android + Twitter 集成中提供帮助。

当我发布状态更新时,我已经在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));
   }
  }
 }
4

4 回答 4

2

虽然你在 onResume() 中成功收到了 user_secret 和 user_token,但你确定你原来的对象还是一样的吗?我在我的 Android 应用程序中遇到了这个问题。我会创建对象,但是当调用 onResume() 时,它是一个全新的 Activity 实例,因为在浏览器启动时它已从内存中释放。因此,当我尝试设置返回的密钥/令牌对时,它不起作用。这更有可能发生在内存有限的设备上。一些人选择在调用之间保留必要的信息,而另一些人决定不启动默认浏览器意图,而是托管一个嵌入式 web 视图,这样他们的原始 signpost-oauth 对象就不会超出范围。

Android 中的 OAuth 实例状态

不确定这是否是问题,但也许值得一看。

于 2010-09-18T19:18:18.280 回答
2

您需要使用 post.addHeader() 将 oauth 信息添加到 http 请求的标头中。要知道要添加到标题中的内容,请查看此处:http ://dev.twitter.com/pages/auth

于 2010-09-24T03:22:57.787 回答
1

我有 2 个针对 2 个不同 Java 库的教程。第一个(过时的)在这里,第二个在这里与 Scribe。它适用于 LinkedIn,但切换到 Twitter 会很容易。我会选择#2

于 2010-09-18T21:35:56.080 回答
1

请描述您正在使用的客户端/消费者/提供者,它们必须是//DefaultHttpClient才能确保正常工作。CommonsHttpOAuthConsumerCommonsHttpOAuthProvider

确保consumer.setTokenWithSecret(oToken, oTokenSecret);在调用此代码之前调用。

另外,post.getParams().setBooleanParameter(CoreProtocolPNames.USE_EXPECT_CONTINUE, false);您的帖子参数中是否存在?

使用 empty 的原因是什么,它什么都不处理,我想BasicResponseHandler它可以在调用中省略。execute

而且,可能是一个愚蠢的问题,可能是你在调用setParams(...)后覆盖参数setEntity(...)

于 2010-09-24T18:00:00.570 回答