2011-01-04 2 views
7

Я пытаюсь получить AuthToken для Facebook (сохранен Facebook для Android), используя следующий фрагмент кода.Как извлечь Facebook-AuthToken из учетных записей, сохраненных на Android

AccountManager am = AccountManager.get(this); 
Account[] accounts = am.getAccountsByType("com.facebook.auth.login"); 
if (accounts.length > 0) {   
    for(int j = 0; j < accounts.length; j++) { 
     Account account = accounts[j]; 
     if(account.type != null && account.type.equals("com.facebook.auth.login")) { 
      Log.e(RuntimeVars.MY_NAME, "FACEBOOK-TYPE FOUND"); 
      am.getAuthToken(account, "com.facebook.auth.login", null, ConversationList.this, 
       new AccountManagerCallback<Bundle>() { 
        public void run(AccountManagerFuture<Bundle> arg0) { 
         try { 
          Bundle b = arg0.getResult(); 
          Log.e(RuntimeVars.MY_NAME, "THIS AUTHTOKEN: " + b.getString(AccountManager.KEY_AUTHTOKEN)); 
         } 
         catch (Exception e) { 
          Log.e(RuntimeVars.MY_NAME, "[email protected]"); 
         } 
        } 
       }, null); 
      } 
     } 
    } 

регистрационные данные будут найдены и FACEBOOK-TYPE НАЙДЕНО записывается в LogCat, но ни ЭТО AUTHTOKEN: [...] ни ИСКЛЮЧЕНИЕ @ AUTHTOKEN регистрируется. Поэтому я полагаю, что am.getAuthToken никогда не вызывается.

Что мне не хватает?

В общем, если есть лучший (и, по крайней мере, рабочий) подход для извлечения Facebook authtoken из аккаунтов Android, пожалуйста, дайте мне знать.

Большое спасибо за помощь!

С наилучшими пожеланиями
С.

ответ

6

Почему бы не использовать SDK для Facebook?

В классе Facebook у него есть член, чтобы получить токен доступа OAuth 2.0 (если это то, что вам нужно), getAccessToken().

+1

Пользователи AFAIK должны ввести свои учетные данные в facebook, если используется SDK Facebook. Но эти учетные данные должны быть уже доступны через поставщика учетных записей, я думал ... – stpn108

+1

Они должны быть, но могут быть запрещены для Android приложения, получающие доступ к данным пользователя без явного разрешения. Я бы определенно предложил пойти с этим (запрашивая пароль при необходимости), а затем замените его позже, если вы найдете способ использования AccountsManager. – Dave

+1

AFAIK - Android Android SDK возвращает токен аутентификации, действительный только на 1 час. Это означает, что пользователю необходимо повторно войти с использованием интерфейса SDK OAUth каждый раз, когда они хотят получить доступ к своей учетной записи FB. – Guy

0

добавить попытку {перед тем am.getAuthToken и поймать исключение, где этот метод декларации ends.This даст вам, почему и где excepption происходит

+0

нет исключений брошенный. если я поставлю это am.getAuthToken внутри попытки, все пройдет. Ничего не поймали. – stpn108

1

Попробуйте позвонить AccountManager.blockingGetAuthToken вместо этого. Если это работает, то здесь есть что-то более интересное ...

Кроме того, убедитесь, что ваш манифест правильно установлен в размере USE_CREDENTIALS.

+0

есть null возвращенный. У вас есть информация о authTokenTypes? Я только предполагаю, что имя для facebook-типа - «com.facebook.auth.login», но я не смог проверить это. – stpn108

+0

Ну, это первое, что нужно подтвердить. Я бы попытался вызвать 'AccountManager.getAccountsByType (null)' для извлечения всех учетных записей и отработать оттуда, чтобы уточнить ваш код. Надеемся, что данные возвращенной учетной записи включают необходимую вам информацию. Он может просто не подвергаться воздействию. – Dave

+0

Очевидно, что для аутентификации Google строка authTokenTypes должна быть «ах». Не знаю, как люди это определили, но для Facebook я бы предположил, что это нечто подобное, к сожалению. – Dave

2

Чтобы объяснить тот факт, что ни один из ваших заявлений лесозаготовок в настоящее время достигли, считают:

Line ~ 8:

 am.getAuthToken(account, "com.facebook.auth.login", null, ConversationList.this, 

... может вернуть маркер, если он сразу доступен. Может быть, это ответ, который вы ищете? Цитирование документации AccountManager:

Если сгенерированные ранее аутентификация маркера кэшируется для этой учетной записи и типа, затем он возвращается. В противном случае, если имеется сохраненный пароль, он отправляет на сервер , чтобы сгенерировать новый токен . В противном случае пользователю будет предложено ввести пароль .

+0

спасибо за ям. но я должен сказать, что я действительно не понимаю, почему это должно объяснить, что ничего не происходит. : -s, как мне кажется, ни новый токен аутентификации не генерируется, ни меня не спрашивают пароль ... – stpn108

+1

Если я правильно понимаю, ничего не происходит, потому что вы не сохраняете результат getAuthToken. То, что я предлагаю в качестве объяснения, означает, что вам нужно будет сделать что-то вроде: 'AccountManagerFuture amf = am.getAuthToken (учетная запись,« com.facebook.auth.login », null, ConversationList.this, .....); ' В настоящее время вы отбрасываете возвращаемое значение, 'amf' в этом примере. Вместо этого сохраните его, и если он не равен нулю, извлеките из него токен аутентификации. Вот что я имел в виду в любом случае, не уверен, что это то, что на самом деле происходит. – nmr

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