2011-01-04 6 views
7

Ich versuche, das AuthToken für Facebook (gespeichert von Facebook für Android) mithilfe des folgenden Codeabschnitts zu ermitteln.So rufen Sie ein Facebook-AuthToken von den auf Android gespeicherten Konten ab

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); 
      } 
     } 
    } 

Die Anmeldedaten werden gefunden und BOOK-TYPE GEFUNDEN in LogCat geschrieben, aber weder THIS authToken: [...] noch AUSNAHME @ authToken angemeldet ist. Also ich nehme an, am.getAuthToken wird nie aufgerufen.

Was fehlt mir?

Wenn es einen besseren (und zumindest funktionierenden) Ansatz zum Abrufen der Facebook-Authentifizierung von den Android-Konten gibt, lassen Sie es mich wissen.

Vielen Dank für Ihre Hilfe!

Mit freundlichen Grüßen
S.

Antwort

6

Warum nicht das Facebook SDK verwenden?

Die Klasse Facebook enthält ein Mitglied, um das OAuth 2.0-Zugriffstoken zu erhalten (falls Sie das benötigen), getAccessToken().

+1

AFAIK-Benutzer müssen ihre Facebook-Anmeldeinformationen eingeben, wenn das Facebook SDK verwendet wird. Aber diese Anmeldeinformationen sollten bereits über den Kontoanbieter verfügbar sein, dachte ich ... – stpn108

+1

Sie sollten, aber möglicherweise eingeschränkt werden, um Android zu verhindern Apps, die ohne explizite Erlaubnis auf die Daten des Nutzers zugreifen, würde ich definitiv empfehlen Lösung (bei Bedarf zur Eingabe eines Passworts) und zu einem späteren Zeitpunkt ersetzen, wenn Sie eine Möglichkeit finden, den AccountsManager zu verwenden. – Dave

+1

AFAIK - Das Facebook Android SDK gibt ein Authentifizierungs-Token zurück, das nur für 1 Stunde gültig ist. Dies bedeutet, dass sich der Benutzer immer erneut mit seiner SDK OAUth-Schnittstelle anmelden muss, wenn er auf seinen FB-Account zugreifen möchte. – Guy

0

Add try {vor am.getAuthToken und fangen Ausnahme, wo diese Methode Erklärung ends.This Sie geben, wo und warum excepption geschieht

+0

gibt es keine Ausnahme geworfen. Wenn ich dieses am.getAuthToken in einen Versuch setze, läuft alles durch. Nichts ist gefangen. – stpn108

1

Versuchen AccountManager.blockingGetAuthToken stattdessen aufrufen. Wenn das funktioniert, dann gibt es hier etwas Interessanteres ...

Stellen Sie außerdem sicher, dass in Ihrem Manifest die Berechtigung USE_CREDENTIALS richtig eingestellt ist.

+0

dort ist null zurückgegeben. Haben Sie Informationen zu den authTokenTypes? Ich nehme nur an, dass der Name für den Facebook-Typ "com.facebook.auth.login" ist, aber das konnte ich nicht bestätigen. – stpn108

+0

Nun, das ist die erste Bestätigung. Ich würde versuchen, "AccountManager.getAccountsByType (null)" aufzurufen, um alle Konten abzurufen und von dort aus zu arbeiten, um den Code zu verfeinern. Wir hoffen, dass die zurückgegebenen Kontodaten die benötigten Informationen enthalten. Es kann einfach nicht belichtet werden. – Dave

+0

Offenbar für Google-Authentifizierung sollte die authTokenTypes-Zeichenfolge "ah" sein. Keine Ahnung, wie die Leute das bestimmt haben, aber für Facebook würde ich annehmen, dass es etwas ähnlich Willkürliches ist. – Dave

2

Um die Tatsache, dass weder Ihre Logging-Anweisungen erreicht werden, sollten Sie erklären:

Linie ~ 8:

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

... zurückgeben kann ein Token, wenn es sofort verfügbar ist. Vielleicht ist das die Antwort, nach der du suchst? Unter Angabe der Konto-Dokumentation:

Wenn ein zuvor generierten Auth-Token für dieses Konto und Typ zwischengespeichert wird, dann wird es zurückgegeben. Andernfalls, wenn ein gespeichertes Kennwort verfügbar ist, wird es an den Server gesendet, um ein neues Auth-Token zu generieren. Andernfalls wird der Benutzer zur Eingabe eines Kennworts aufgefordert.

+0

dank nmr. aber ich muss sagen, dass ich nicht wirklich verstehe, warum das erklären sollte, dass nichts passiert. : -s, wie es mir erscheint, noch wird ein neues Authentifizierungs-Token erzeugt und ich werde auch nicht nach dem Passwort gefragt ... – stpn108

+1

Wenn ich richtig verstehe, passiert nichts, weil Sie das Ergebnis von getAuthToken nicht speichern. Was ich als Erklärung vorschlage, bedeutet, dass Sie Folgendes tun müssten: 'AccountManagerFuture amf = am.getAuthToken (Konto," com.facebook.auth.login ", null, ConversationList.this, .....); ' Momentan verwerfen Sie den Rückgabewert 'amf' in diesem Beispiel. Speichern Sie es stattdessen und wenn es nicht null ist, rufen Sie das Authentifizierungs-Token von ihm ab. Das meinte ich jedenfalls, nicht sicher, ob das tatsächlich passiert. – nmr

Verwandte Themen