Android OAuth: Исключение из retrieveAccessToken ()

Я настраиваю OAuth для своего приложения для Android. Чтобы проверить это, я сделал следующее: Добавил в мой проект signpost-core-1.2.1.1.jar и signpost-commonshttp4-1.2.1.1.jar, добавил переменные «CommonsHttpOAuthConsumer consumer» и «CommonsHttpOAuthProvider provider» и сделал следующее, когда Нажата кнопка:

consumer = new CommonsHttpOAuthConsumer("xxx", "yyy"); provider = new CommonsHttpOAuthProvider("https://api.twitter.com/oauth/request_token", "https://api.twitter.com/oauth/access_token", "https://api.twitter.com/oauth/authorize"); oauthUrl = provider.retrieveRequestToken(consumer, "myapp://twitterOauth"); persistOAuthData(); this.startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(oauthUrl))); 

PersistOAuthData () выполняет следующие действия:

 protected void persistOAuthData() { try { FileOutputStream providerFOS = this.openFileOutput("provider.dat", MODE_PRIVATE); ObjectOutputStream providerOOS = new ObjectOutputStream(providerFOS); providerOOS.writeObject(this.provider); providerOOS.close(); FileOutputStream consumerFOS = this.openFileOutput("consumer.dat", MODE_PRIVATE); ObjectOutputStream consumerOOS = new ObjectOutputStream(consumerFOS); consumerOOS.writeObject(this.consumer); consumerOOS.close(); } catch (Exception e) { } } 

Таким образом, потребитель и поставщик сохраняются до открытия браузера, как описано здесь .

В методе onResume () я загружаю данные провайдера и потребителя и делаю следующее:

  Uri uri = this.getIntent().getData(); if (uri != null && uri.getScheme().equals("myapp") && uri.getHost().equals("twitterOauth")) { verifier = uri.getQueryParameter(oauth.signpost.OAuth.OAUTH_VERIFIER); if (!verifier.equals("")) { loadOauthData(); try { provider.retrieveAccessToken(consumer, verifier); } catch (OAuthMessageSignerException e) { e.printStackTrace(); } catch (OAuthNotAuthorizedException e) { e.printStackTrace(); } catch (OAuthExpectationFailedException e) { e.printStackTrace(); } catch (OAuthCommunicationException e) { e.printStackTrace(); } } } 

Итак, что работает: 1) Я получаю requestToken и requestSecret. 2) Я получаю oauthUrl. 3) Я направляюсь на страницу браузера, чтобы авторизовать свое приложение. 4) Я перенаправляюсь в свое приложение. 5) Я получаю верификатор. Но вызов retrieveAccessToken (потребитель, верификатор) терпит неудачу с OAuthCommunicationException, говорящим: «Связь с поставщиком услуг не удалась: null».

Кто-нибудь знает, в чем причина? У некоторых людей возникают проблемы с получением запросаToken, но это работает нормально. Интересно, может быть, проблема в том, что мое приложение также включило apache-mime4j-0.6.jar и httpmime-4.0.1.jar, которые мне нужны для многостраничной загрузки.

Хорошо, я понял это. Возможно, это полезно для других:

Прежде всего, вам не нужно сохранять весь объект-потребитель и поставщик. Все, что вам нужно сделать, это сохранить requestToken и requestSecret. К счастью, это строки, поэтому вам не нужно записывать их на диск или что-то еще. Просто сохраните их в sharedPreferences или что-то в этом роде.

Теперь, когда вы перенаправляетесь браузером и вызывается метод onResume (), выполните следующие действия:

 //The consumer object was lost because the browser got into foreground, need to instantiate it again with your apps token and secret. consumer = new CommonsHttpOAuthConsumer("xxx", "yyy"); //Set the requestToken and the tokenSecret that you got earlier by calling retrieveRequestToken. consumer.setTokenWithSecret(requestToken, tokenSecret); //The provider object is lost, too, so instantiate it again. provider = new CommonsHttpOAuthProvider("https://api.twitter.com/oauth/request_token", "https://api.twitter.com/oauth/access_token", "https://api.twitter.com/oauth/authorize"); //Now that's really important. Because you don't perform the retrieveRequestToken method at this moment, the OAuth method is not detected automatically (there is no communication with Twitter). So, the default is 1.0 which is wrong because the initial request was performed with 1.0a. provider.setOAuth10a(true); provider.retrieveAccessToken(consumer, verifier); 

Вот и все, теперь вы можете получить токен и секрет с getToken () и getTokenSecret ().

Привет, Мануэль, я вижу, что вы избегаете OAuthocalypse! Heres – хороший пример для реализации OAuth для Twitter с использованием sharedPreferences для сохранения requestToken и requestSecret, как и ваше решение. http://github.com/brione/Brion-Learns-OAuth by Brion Emde

Heres видео

Надеюсь, это поможет другим разработчикам =)

Intereting Posts
В чем разница между инструментами платформы и инструментами SDK в разработке Android? Захват изображения Intent вызывает NullPointerException только на телефонах Samsung Активность должна быть прозрачной, но имеет черный фон Retrow UncaughtExceptionHandler Исключение после ведения журнала Как остановить и запустить ProgressBar Как разместить вертушку под макетом спиннера, когда он щелкнут, и показать фигурку в леденец и выше? Android: Haptic обратная связь: onClick () событие против hapticFeedbackEnabled в представлении Невозможно увидеть значение параметра в Android Studio, когда точка останова находится в первой строке метода Как запустить новый класс активности во всплывающем окне AlertDialog, нажав кнопку ok Избежать увольнения PopupWindow после касания снаружи Android Dev – URL-адрес обратного вызова не работает … (0_o) Что такое целочисленное значение, которое дает приоритету широковещательного приемника? Android – сообщения с высоким приоритетом с облачной службой Google (с использованием corona sdk) Получите тип построения градиента в вкусе продукта Использовать учетную запись службы, чтобы проверить Google InAppPurchase