Android 推特&x2B;OAuth集成

Android 推特&x2B;OAuth集成,android,oauth,twitter,twitter-oauth,Android,Oauth,Twitter,Twitter Oauth,任何人都可以使用OAuth在Android+Twitter集成方面提供帮助 当我发布状态更新时,我已经处理并得到下面列出的错误 WARN/System.err(190): org.apache.http.client.HttpResponseException: Unauthorized WARN/System.err(190): at org.apache.http.impl.client.BasicResponseHandler.handleResponse(BasicRespons

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

当我发布状态更新时,我已经处理并得到下面列出的错误

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_令牌,并存储在preferences中

所以问题在于使用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));
   }
  }
 }
私有类PostTask扩展了AsyncTask{
进行对话后对话;
@凌驾
受保护的void onPreExecute(){
postDialog=ProgressDialog.show(BLOA.this,
getText(R.string.tweet\u progress\u title),
getText(R.string.tweet\u progress\u text),true,//不确定
//持续时间
false);//不可取消
}
@凌驾
受保护的JSONObject doInBackground(字符串…参数){
JSONObject jso=null;
试一试{
HttpPost=新的HttpPost(
"http://twitter.com/statuses/update.json");
LinkedList out=新建LinkedList();
out.add(新的BasicNameValuePair(“状态”,参数[0]);
setEntity(新的UrlEncodedFormEntity(out,HTTP.UTF_8));
setParams(getParams());
//对请求进行签名以进行身份验证
mConsumer.标志(邮政);
字符串响应=mClient.execute(post,
新BasicResponseHandler());
jso=新的JSONObject(响应);
}捕获(不支持的编码异常e){
e、 printStackTrace();
}捕获(OAuthMessageSignerException e){
e、 printStackTrace();
}捕获(OAutheExpectationFailedException e){
e、 printStackTrace();
}catch(OAuthCommunicationException e){
e、 printStackTrace();
}捕获(客户端协议例外e){
e、 printStackTrace();
}捕获(IOE异常){
e、 printStackTrace();
}捕获(JSONException e){
e、 printStackTrace();
}最后{
}
返回jso;
}
//这是在UI线程中,所以我们可以搞乱UI
受保护的void onPostExecute(JSONObject jso){
postDialog.disclose();
如果(jso!=null){//授权成功,则json对象
//包含用户信息
mEditor.setText(“”);
mLast.setText(getCurrentTweet(jso));
}否则{
mLast.setText(getText(R.string.tweet_error));
}
}
}

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


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

尽管您在onResume()中成功地收到了user\u secret和user\u令牌,但您确定您的原始对象仍然相同吗?我在Android应用程序中遇到了这个问题。我会创建这些对象,但当调用onResume()时,它是该活动的一个全新实例,因为当浏览器启动时,它是从内存中释放出来的。因此,当我试图设置返回的秘密/令牌对时,它无法工作。这种情况更可能发生在内存有限的设备上。有些人选择在调用之间保留必要的信息,而另一些人决定不启动默认的浏览器意图,而是托管一个嵌入式webview,这样他们的原始路标oauth对象就不会超出范围


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

我有两个关于两种不同Java库的教程。(注明日期)在这里,有抄写员。这是针对LinkedIn的,但切换到Twitter会很容易。我会选择#2

我有两个针对两种不同Java库的教程。(注明日期)在这里,有抄写员。这是针对LinkedIn的,但切换到Twitter会很容易。我将使用#2

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

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

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

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

另外,is
post.getParams().setBooleanPParameter(CoreProtocolPNames.USE\u EXPECT\u CONTINUE,false)是否存在于您的post参数中

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


而且,这可能是一个愚蠢的问题,可能是您在调用
setParams(…)
之后调用
setEntity(…)

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

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

另外,is
post.getParams().setBooleanPParameter(CoreProtocolPNames.USE\u EXPECT\u CONTINUE,false)是否存在于您的post参数中

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

而且,这可能是一个愚蠢的问题,可能是调用
setParams(…)
之后的
setEntity(…)

My时覆盖了参数