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

时间:2011-12-16 13:26:59

标签: android twitter4j

我正在使用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();
    }
}

谢谢。

6 个答案:

答案 0 :(得分:12)

如果是在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=&colspec=ID%20Type%20Status%20Priority%20Milestone%20Owner%20Summary&groupby=&sort=&id=71

答案 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;
    }
}