【问题标题】:Twitter + OAuth IntegrationTwitter + OAuth 集成
【发布时间】:2011-04-12 16:14:42
【问题描述】:

任何人都可以在使用 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));
   }
  }
 }

【问题讨论】:

标签: android oauth twitter twitter-oauth


【解决方案1】:

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

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

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

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 我的代码是上面写的..你能详细解释一下吗?或者给我一个例子?
    • 您正在使用标志库,它使用 OAuth 协议简化了交互,因此不需要手动设置标头。请在下面回答我的问题,我会尽力帮助你,我也在我的项目中使用路标库。
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

      OAuth instance state in Android

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-07-12
        • 2013-10-08
        • 2014-12-02
        • 2013-07-04
        • 1970-01-01
        • 2011-12-27
        • 2011-05-02
        • 2013-01-11
        相关资源
        最近更新 更多