我正在使用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();
}
}
谢谢。
答案 0 :(得分:12)
如果是在ICS中,我强烈建议不要使用StrictMode.enableDefaults;
。
ICS不允许在UI线程中发生Http请求,因此当您执行上述操作时,您会收到该错误。
要解决此问题,请在后台线程和provider.retrieveRequestToken(consumer, CALLBACK_URL);
中执行provider.retrieveAccessToken(consumer, verifier);
。
答案 1 :(得分:2)
我终于找到了问题,他在最新版本的android中与StrictModes有关。在拨打电话之前运行StrictMode.enableDefaults();
,问题已得到纠正。
虽然它对我有用,但我想知道是否有更优雅的解决方案可以解决问题。
答案 2 :(得分:1)
在android清单文件中添加了关于使用“INTERNET”的权限标记。
TAG ------>
快乐编码......: - )
答案 3 :(得分:0)
检查两个步骤
1- 在Twitter网站上创建的Twitter应用中提供回拨网址
2- 转到手机设置,然后点击“日期和时间”,然后选择“自动”
答案 4 :(得分:0)
在OnCreate()中尝试:
StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);
答案 5 :(得分:0)
AsyncTask的示例
/**
* Represents an asynchronous login/registration task used to authenticate
* the user.
*/
public class RequestTask extends AsyncTask<Void, Void, Boolean> {
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;
}
}