2011-01-04 9 views
7

Sto cercando di recuperare AuthToken per Facebook (salvato da Facebook per Android) utilizzando la seguente parte di codice.Come recuperare un Facebook-AuthToken dagli account salvati su 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); 
      } 
     } 
    } 

Le credenziali di accesso sono trovati e FACEBOOK-tipo che si trova è scritto in LogCat, ma nessuno dei due QUESTO authtoken: [...]ECCEZIONE @ authtoken viene registrato. Quindi suppongo che am.getAuthToken non venga mai chiamato.

Cosa mi manca?

In generale, se esiste un approccio migliore (e almeno funzionante) per il recupero dell'autoreken di Facebook dagli account Android, fatemelo sapere.

Grazie mille per il vostro aiuto!

migliori saluti
S.

risposta

6

Perché non utilizzare l'SDK di Facebook?

Il Facebook classe ha un membro per ottenere l'OAuth 2.0 token di accesso (se questo è quello che ti serve), getAccessToken().

+1

Gli utenti di AFAIK devono inserire le loro credenziali di Facebook se viene utilizzato l'SDK di Facebook, ma tali credenziali dovrebbero essere già disponibili tramite il provider di account, ho pensato ... – stpn108

+1

Dovrebbero essere, ma potrebbero essere limitate per impedire Android app che accedono ai dati dell'utente senza il permesso esplicito. Suggerirei sicuramente di andare con questo soluzione (richiesta di una password quando necessario), quindi sostituirla in un secondo momento se si trova il modo di utilizzare AccountsManager. – Dave

+1

AFAIK - L'SDK Android di Facebook restituisce un token di autenticazione che è valido solo per 1 ora. Ciò significa che l'utente deve effettuare nuovamente l'accesso utilizzando l'interfaccia OAUth dell'SDK ogni volta che desidera accedere al proprio account FB. – Guy

0

add try {prima am.getAuthToken e Exception cattura dove questo metodo ends.This dichiarazione vi darà perché e dove excepption sta accadendo

+0

non ci sono eccezioni generate. se metto questo am.getAuthToken all'interno di una prova, tutto viene eseguito. Nulla è catturato. – stpn108

1

Prova a chiamare AccountManager.blockingGetAuthToken invece. Se funziona, allora c'è qualcosa di più interessante in difetto qui ...

Inoltre, assicurati che il tuo manifest abbia il permesso USE_CREDENTIALS impostato correttamente.

+0

non viene restituito nulla. Hai qualche informazione su authTokenTypes? Suppongo solo che il nome per il tipo di facebook sia "com.facebook.auth.login", ma non ho potuto verificarlo. – stpn108

+0

Beh, questa è la prima cosa da confermare. Proverò a chiamare "AccountManager.getAccountsByType (null)" per recuperare tutti gli account e a lavorare da lì per perfezionare il codice. Sperando che i dati dell'account restituiti includano le informazioni di cui hai bisogno. Potrebbe semplicemente non essere esposto. – Dave

+0

Apparentemente per Google auth la stringa authTokenTypes dovrebbe essere "ah". Non ho idea di come la gente lo abbia determinato, ma per Facebook immagino che sia qualcosa di altrettanto arbitrario, sfortunatamente. – Dave

2

di spiegare il fatto che nessuno dei sue dichiarazioni di registrazione vengono raggiunti, prendere in considerazione:

Linea ~ 8:

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

... può restituire un gettone se è immediatamente disponibile. Forse è questa la risposta che stai cercando? Citando la documentazione AccountManager:

Se un generato in precedenza autenticazione gettone viene memorizzato nella cache per questo account e tipo, allora viene restituito. Altrimenti, se è disponibile una password salvata , è inviata al server per generare un nuovo token di autorizzazione . In caso contrario, l'utente è richiesto per inserire una password.

+0

grazie nmr. ma devo dire che non capisco davvero perché questo dovrebbe spiegare che non succede nulla. : -s come mi sembra, né viene generato un nuovo token di autenticazione né viene richiesta la password ... – stpn108

+1

Se capisco correttamente, non succede niente perché non stai salvando il risultato di getAuthToken. Quello che sto proponendo come spiegazione significa che dovresti fare qualcosa del tipo: 'AccountManagerFuture amf = am.getAuthToken (account," com.facebook.auth.login ", null, ConversationList.this, .....) Attualmente si sta scartando il valore restituito, 'amf' in questo esempio. Invece, memorizzalo e se non è nullo, recupera il token di autenticazione da esso. Questo è quello che intendevo in ogni caso, non so se è ciò che sta realmente accadendo. – nmr

Problemi correlati