方法retrieveRequestToken引发“与服务提供者的通信失败:null”

我正在使用twitter4j从我的应用程序发送推文。 当我调用retrieveRequestToken方法时,我收到错误“与服务提供者的通信失败:null”。

public static void askOAuth(Context context) { try { // Use Apache HttpClient for HTTP messaging consumer = new CommonsHttpOAuthConsumer(CONSUMER_KEY, CONSUMER_SECRET); provider = new CommonsHttpOAuthProvider( "https://api.twitter.com/oauth/request_token", "https://api.twitter.com/oauth/access_token", "https://api.twitter.com/oauth/authorize"); String authUrl = provider.retrieveRequestToken(consumer, CALLBACK_URL); Toast.makeText(context, "Authorize this app!", Toast.LENGTH_LONG).show(); context.startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(authUrl))); } catch (Exception e) { Log.e(APP, e.getMessage()); Toast.makeText(context, e.getMessage(), Toast.LENGTH_LONG).show(); } } 

谢谢。

如果这是在ICS中,我强烈建议不要使用StrictMode.enableDefaults;

ICS不允许在UI线程中发生Http请求,因此当您执行上述操作时,您会收到该错误。

要解决此问题,请执行provider.retrieveRequestToken(consumer, CALLBACK_URL); 在后台线程以及provider.retrieveAccessToken(consumer, verifier);

资料来源: http : //code.google.com/p/oauth-signpost/issues/detail?can = 2&start = 0&num = 100&q =&cfpec = ID%20Type%20Status%20Priority%20Milestone%20Owner%20Summary&groupby=&sort=&id= 71

我终于find了问题,他在最新版本的android中与StrictModes有关。 运行StrictMode.enableDefaults(); 在拨打电话之前,问题已得到纠正。

虽然它对我有用,但我想知道是否有更优雅的解决方案来解决问题。

在android清单文件中添加了关于使用“INTERNET”的权限标记。

TAG ——>

快乐编码… 🙂

检查两个步骤

1- 在Twitter网站上为您创建的Twitter应用中提供回拨URL
2- 转到手机设置,然后点击“日期和时间”,然后选择“自动”

尝试在OnCreate()内部:

 StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build(); StrictMode.setThreadPolicy(policy); 

AsyncTask的示例

  /** * Represents an asynchronous login/registration task used to authenticate * the user. */ public class RequestTask extends AsyncTask { String content; private ProgressDialog dialog; protected void onPreExecute() { dialog = new ProgressDialog(LoginUsingTwitterActivity.this); dialog.setMessage("Loading..."); dialog.setCancelable(false); dialog.show(); } protected Boolean doInBackground(Void... params) { httpOauthConsumer = new CommonsHttpOAuthConsumer( TWITTER_CONSUMER_KEY, TWITTER_CONSUMER_SECRET); httpOauthprovider = new DefaultOAuthProvider(REQUEST_URL, ACCESS_URL, AUTHORIZE_URL); try { authUrl = httpOauthprovider.retrieveRequestToken( httpOauthConsumer, CALLBACK_URL); } catch (OAuthMessageSignerException e) { e.printStackTrace(); return false; } catch (OAuthNotAuthorizedException e) { e.printStackTrace(); return false; } catch (OAuthExpectationFailedException e) { e.printStackTrace(); return false; } catch (OAuthCommunicationException e) { e.printStackTrace(); return false; } return true; } @Override protected void onPostExecute(final Boolean success) { if (success == true) { Log.e("LoginUsingTwitterActivity", "onPostExecute"); startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(authUrl))); } dialog.dismiss(); } @Override protected void onCancelled() { dialog.dismiss(); mAuthTask = null; } }