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

post.addHeader() を使用して、http 要求のヘッダーに oauth 情報を追加する必要があります。ヘッダーに追加するものを知るには、こちらをご覧ください: http://dev.twitter.com/pages/auth

于 2010-09-24T03:22:57.787 に答える
2

onResume() で user_secret と user_token を正常に受け取りましたが、元のオブジェクトは同じままですか? Androidアプリでこの問題が発生しました。私はオブジェクトを作成しますが、 onResume() が呼び出されたとき、ブラウザの起動時にメモリから解放されたため、アクティビティのまったく新しいインスタンスでした。そのため、返されたシークレット/トークンのペアを設定しようとしても機能しませんでした。これは、メモリが限られているデバイスで発生する可能性が高くなります。呼び出し間で必要な情報を保持することを選択する人もいれば、デフォルトのブラウザー インテントを起動せずに埋め込み Web ビューをホストして、元の signpost-oauth オブジェクトが範囲外にならないようにすることを選択する人もいます。

Android での OAuth インスタンスの状態

これが問題かどうかはわかりませんが、一見の価値があるかもしれません。

于 2010-09-18T19:18:18.280 に答える
1

2つの異なるJavaライブラリ用の2つのチュートリアルがあります。最初のもの(日付)はここにあり、2番目のものはここにScribeがあります。LinkedIn用ですが、Twitterへの切り替えは非常に簡単です。私は#2で行きます

于 2010-09-18T21:35:56.080 に答える
1

Please describe what Client/Consumer/Provider you are using, they must be DefaultHttpClient/CommonsHttpOAuthConsumer/CommonsHttpOAuthProvider to work properly for sure.

Ensure you call consumer.setTokenWithSecret(oToken, oTokenSecret); before calling this code.

Also, is post.getParams().setBooleanParameter(CoreProtocolPNames.USE_EXPECT_CONTINUE, false); exists in your post params?

What's the reason for using empty BasicResponseHandler, it handles nothing and it can be omitted in execute call, I suppose.

And, may be a dumb question, may be you are overwriting params when calling setParams(...) after setEntity(...)

于 2010-09-24T18:00:00.570 に答える