【问题标题】:method retrieveRequestToken raises "Communication with the service provider failed: null"方法retrieveRequestToken 引发“与服务提供商的通信失败:null”
【发布时间】:2012-01-22 00:27:26
【问题描述】:

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

谢谢。

【问题讨论】:

    标签: android twitter4j


    【解决方案1】:

    如果这是在 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

    【讨论】:

    • 太棒了!很好的答案。我自己永远也想不通。在这个问题上花了两天时间。谢谢。 Grantland Chew,你就是男人!
    • 我已经在单独的线程中进行了这些调用,但我仍然只有在使用 Proguard 之后才会遇到这个问题。我已经从 proguard-project.txt 中排除了 Twitter4j。有什么想法吗?
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

      标签 ------>

      快乐编码... :-)

      【讨论】:

        【解决方案4】:

        检查两个步骤

        1-在您的 twitter 应用中提供回调 URL,由您在 twitter 网站上创建
        2-转到电话设置,然后点击“日期和时间”并选择“自动”

        【讨论】:

        【解决方案5】:

        在 OnCreate() 内部尝试:

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

        【讨论】:

          【解决方案6】:

          异步任务示例

              /**
           * 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;
              }
          }
          

          【讨论】:

            猜你喜欢
            • 2013-07-06
            • 1970-01-01
            • 2011-08-12
            • 2013-04-26
            • 2015-07-18
            • 2012-03-12
            • 1970-01-01
            • 1970-01-01
            • 2021-10-17
            相关资源
            最近更新 更多