Intereting Posts
Android получает путь от источника видео от VideoView Стиль TextView как Spinner с appcompat v21 Как реализовать поддержку PdfRenderer Zoom и Scroll? Android – Карусель, как виджет, который отображает часть левого и правого элементов Как я могу посмотреть локальные проекты с эмулятором Android SDK? UDP / RTCP Пакеты, недоступные устройству / приложению Когда экран устройства заблокирован SDK Google Analytics делает операции с дисками в потоке пользовательского интерфейса? Как установить приложение Android с внешним MySQL db Дополнительные разрешения, чтобы приложение отображалось на всех устройствах и включало дополнительные функции на некоторых устройствах? Возможно ли, и что является лучшей стратегией, передавать объекты по ссылке из одного действия в другое? Запускать активность из службы при нажатии на уведомление Ошибка при создании AOSP для Ubuntu 15.04 из Master-Build Stopped Subcommand Failed Java.io.IOException: Ошибка при выполнении exec () Рабочий каталог: null Окружающая среда: null Как настроить фокус на диалоговом окне предупреждения об андроиде? Самый эффективный способ анализа JSON с помощью Android

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 видео

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