方法retrieveRequestToken引发“与服务提供商的通信失败:null”错误。

9
使用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个回答

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


太棒了!非常好的答案。我自己永远不会想到这个。我在这个问题上花了两天时间。谢谢。Grantland Chew,你就是那个人! - Abhijit
我已经在单独的线程中进行这些调用,但仅在使用Proguard后才遇到此问题。而且我已经从proguard-project.txt中排除了Twitter4j。有任何想法吗? - Nayanesh Gupte

2

我终于找到问题所在,它与最新版本的安卓中的StrictModes有关。在调用之前运行StrictMode.enableDefaults();后,问题得到了纠正。

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


1

已在Android清单文件中添加了有关使用“INTERNET”的权限标签。

标签 ------>

编程愉快... :-)


0

检查两个步骤

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


@GuillermoTobar 请查看此链接 https://dev59.com/SljUa4cB1Zd3GeqPOytm#9987465 - Atul Bhardwaj

0

在OnCreate()内尝试:

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接