2015-03-30 3 views
3

Я пытаюсь получить токен OAuth из AccountManager для учетной записи Twitter и использовать его для отслеживания твиттера с помощью Twitter4j. Но я получаю не найденных проблем проверки подлинности TwitterException.Android - AccountManager Twitter OAuth, не найдено проблем с проверкой подлинности

Беллоу код, чтобы получить маркер и следовать за пользователем:

try{ 

    AccountManager accountManager = AccountManager.get(getActivity()); 
    Account twitterAccount = accountManager.getAccountsByType(AccountType.TWITTER.getType())[0]; 
AccountManagerFuture<Bundle> tokenFuture = accountManager.getAuthToken(twitterAccount, "com.twitter.android.oauth.token", null, true, new AccountManagerCallback<Bundle>() { 
        public void run(AccountManagerFuture<Bundle> result) { 
         Bundle bundle; 
         try { 
          bundle = result.getResult(); 
          Intent intent = (Intent) bundle.get(AccountManager.KEY_INTENT); 
          if (intent != null) { 
           // User input required 
           getActivity().startActivity(intent); 
          } else { 
           String token = bundle.getString(AccountManager.KEY_AUTHTOKEN); 
           Log.i(TAG, "Token:" + token); 
           userToken = token; 
          } 
         } catch (Exception e) { 
          Log.e(TAG, "Error getting token", e); 
         } 

       } 

      }, null); 

      AccountManagerFuture<Bundle> secretFuture = accountManager.getAuthToken(twitterAccount, "com.twitter.android.oauth.token.secret", null, true, new AccountManagerCallback<Bundle>() { 
       public void run(AccountManagerFuture<Bundle> result) { 
        Bundle bundle; 
        try { 
         bundle = result.getResult(); 
         Intent intent = (Intent) bundle.get(AccountManager.KEY_INTENT); 
         if (intent != null) { 
          // User input required 
          getActivity().startActivity(intent); 
         } else { 
          String secret = bundle.getString(AccountManager.KEY_AUTHTOKEN); 
          Log.i(TAG, "Secret Token:" + secret); 
          userSecret = secret; 

         } 
        } catch (Exception e) { 
         Log.e(TAG, "Error getting token", e); 
        } 

       } 

      }, null); 
      ConfigurationBuilder configurationBuilder = new ConfigurationBuilder(); 
      configurationBuilder 
        .setOAuthConsumerKey(<Consumer-key>); 
      configurationBuilder 
        .setOAuthConsumerSecret(<Consumer-Secret>); 

       configurationBuilder.setOAuthAccessToken(userToken); 
      configurationBuilder.setOAuthAccessTokenSecret(userSecret); 
      Twitter twitter = new TwitterFactory(configurationBuilder.build()).getInstance(); 
      User user = twitter.createFriendship(param.getUserName()); 
      Toast.makeText(followListActivity,"Followed user @"+user.getScreenName()+" :)",Toast.LENGTH_SHORT); 


     } catch (TwitterException e) { 
      e.printStackTrace(); 
     } 

Получение это исключение:

TwitterException{exceptionCode=[ec1fe56d-1e3b4ac5 3ea58453-a92e09a2], statusCode=-1, message=null, code=-1, retryAfter=-1, rateLimitStatus=null, version=4.0.2} 
at twitter4j.HttpClientImpl.handleRequest(HttpClientImpl.java:178) 
at twitter4j.HttpClientBase.request(HttpClientBase.java:53) 
at twitter4j.HttpClientBase.get(HttpClientBase.java:71) 
at twitter4j.TwitterBaseImpl.fillInIDAndScreenName(TwitterBaseImpl.java:128) 
at twitter4j.TwitterImpl.verifyCredentials(TwitterImpl.java:545) 
at asynctask.FollowTwitterUserAsyncTask.doInBackground(FollowTwitterUserAsyncTask.java:113) 
at asynctask.FollowTwitterUserAsyncTask.doInBackground(FollowTwitterUserAsyncTask.java:33) 
at android.os.AsyncTask$2.call(AsyncTask.java:287) 
at java.util.concurrent.FutureTask.run(FutureTask.java:234) 
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230) 
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080) 
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573) 
at java.lang.Thread.run(Thread.java:841) 
Caused by: java.io.IOException: No authentication challenges found 
at libcore.net.http.HttpURLConnectionImpl.getAuthorizationCredentials(HttpURLConnectionImpl.java:438) 
at libcore.net.http.HttpURLConnectionImpl.processAuthHeader(HttpURLConnectionImpl.java:418) 
at libcore.net.http.HttpURLConnectionImpl.processResponseHeaders(HttpURLConnectionImpl.java:367) 
at libcore.net.http.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:301) 
at libcore.net.http.HttpURLConnectionImpl.getResponseCode(HttpURLConnectionImpl.java:497) 
at libcore.net.http.HttpsURLConnectionImpl.getResponseCode(HttpsURLConnectionImpl.java:134) 
at twitter4j.HttpResponseImpl.<init>(HttpResponseImpl.java:35) 
at twitter4j.HttpClientImpl.handleRequest(HttpClientImpl.java:142) 

Пожалуйста, укажите, что я делаю неправильно здесь.

+0

Вниз избирателя, можете ли вы привести повод? Пожалуйста, укажите, почему. Любая помощь ценится, я здесь застрял. –

ответ

0

Вы не делаете ничего плохого, это проблема с библиотекой. В Android код ответа HTTP 401 вызывает исключение IOException. Редактор библиотеки checks for the message string of the IOException to catch it, однако ваша строка сообщения немного отличается, поэтому обработка исключений не выполняется. К несчастью, трекер проблем не включен для that GitHub project, но вы можете попытаться связаться с the project owner, может быть, он исправит его для вас. В противном случае вам придется изменить код библиотеки и создать ее самостоятельно.

+0

И, как вы думаете, какое исключение должно быть обработано? –

+0

Даже если мы справимся с этим, его 401, это неудача. –

+0

Как говорится в коде (см. Первую ссылку), причина в том, что токен истек, и решение должно состоять в том, чтобы вызывать тот же запрос во второй раз, но библиотека не делает этого, поскольку сообщение об ошибке отличается от версии вашего Android. Кажется, библиотека нуждается в исправлении. Если владелец проекта не отвечает, вы можете разветвить проект github для этого. Я считаю, что сравнение строки сообщений не является хорошим подходом. Возможно, его просто достаточно, чтобы сделать вызов второй раз в каждом случае. Если есть другая причина исключения, это, скорее всего, повторится. – Paramaeleon

Смежные вопросы