вызывает метод 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();
    }
}

Спасибо.


person Guillermo Tobar    schedule 16.12.2011    source источник


Ответы (6)


Если это в ICS, я настоятельно не рекомендую использовать StrictMode.enableDefaults;.

ICS не позволяет 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

person Grantland Chew    schedule 14.01.2012
comment
Фантастика! Отличный ответ. Сам бы никогда не догадался. Потратил два дня на этот вопрос. Спасибо. Грантленд Чу, ты МУЖЧИНА! - person Abhijit; 17.02.2012
comment
Я уже делаю эти вызовы в отдельном потоке, но все равно сталкиваюсь с этой проблемой ТОЛЬКО после использования Proguard. И я уже исключил Twitter4j из proguard-project.txt. Любая идея? - person Nayanesh Gupte; 04.12.2014

Я наконец-то нашел проблему, он связан со StrictModes в последних версиях андроида. Запустив StrictMode.enableDefaults(); перед звонком, проблема устранена.

Хотя это сработало для меня, я хотел бы знать, есть ли более элегантное решение для исправления проблемы.

person Guillermo Tobar    schedule 20.12.2011

Добавлен тег разрешения на использование «INTERNET» в файле манифеста Android.

ТЕГ ------>

Happy Coding... :-)

person Rocker    schedule 16.12.2011

Проверьте два шага

1-Укажите URL-адрес обратного вызова в своем приложении Twitter, созданном вами на веб-сайте Twitter
2-Перейдите в настройки телефона, затем нажмите «Дата и время» и выберите «Автоматически»

person Atul Bhardwaj    schedule 03.04.2012
comment
@GuillermoTobar Пожалуйста, проверьте эту ссылку stackoverflow.com/questions/6324474/ - person Atul Bhardwaj; 27.09.2012

попробуйте внутри OnCreate():

StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy); 
person Duna    schedule 28.08.2013

Пример асинхронной задачи

    /**
 * 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;
    }
}
person Adrian    schedule 04.02.2014