Ich versuche, in meine Anwendung zum Abrufen für die Authentifizierung mit GoogleAccountCredential anmelden:Failing OAuth 2.0 Zugriffstoken auf Android-Emulator
mGoogleAccountCredential = GoogleAccountCredential.usingOAuth2(context, Arrays.asList(Scopes.EMAIL, Scopes.PLUS_LOGIN));
mGoogleAccountCredential.setSelectedAccountName(accountName);
String token = mGoogleAccountCredential.getToken();
Es funktioniert gut auf realen Geräten, sondern auf dem Android-Emulator mGoogleAccountCredential.getToken()
schlägt fehl mit folgenden Ausnahme:
java.lang.IllegalArgumentException: the name must not be empty: null
03-01 19:41:31.604 3203-3361/com.myapp W/System.err: at android.accounts.Account.<init>(Account.java:48)
03-01 19:41:31.604 3203-3361/com.myapp W/System.err: at com.google.android.gms.auth.GoogleAuthUtil.getToken(Unknown Source)
03-01 19:41:31.604 3203-3361/com.myapp W/System.err: at com.google.api.client.googleapis.extensions.android.gms.auth.GoogleAccountCredential.getToken(GoogleAccountCredential.java:255)
- Google-Dienste, die auf dem Emulator Play (
GoogleApiAvailability.isGooglePlayServicesAvailable(context)
liefert 0) accountName
gesetzt und richtig, wenn dersetSelectedAccountName
(auf"[email protected]"
)- alle Berechtigungen, dependecies und Konfigurationen gibt es in dem Projekt übergeben (wie in der Tat, es funktioniert auf allen realen Geräten)
Irgendein Hinweis warum funktioniert es nicht auf dem Emulator?
UPD:
Nach einem wenig in der Google-Code zu graben: das Problem tritt in setSelectedAccountName(accountName)
Verfahren. Diese Methode fordert GoogleAccountManager
an, ihm einen Account zu geben, der dem angegebenen Kontonamen zugeordnet ist. Wenn es kein solches Konto ist, wird der Kontoname null
gesetzt wird:
public final GoogleAccountCredential setSelectedAccountName(String accountName) {
selectedAccount = accountManager.getAccountByName(accountName);
// check if account has been deleted
this.accountName = selectedAccount == null ? null : accountName;
return this;
}
AccountManager
, die wiederum alle bestehenden Konto übergeht und vergleicht ihre Namen auf den angegebenen Kontonamen. Wenn eine Übereinstimmung vorliegt, wird das entsprechende Konto zurückgegeben:
public Account getAccountByName(String accountName) {
if (accountName != null) {
for (Account account : getAccounts()) {
if (accountName.equals(account.name)) {
return account;
}
}
}
return null;
}
public Account[] getAccounts() {
return manager.getAccountsByType("com.google");
}
Die Sache ist die, dass getAccounts()
kehrt leer Array auf dem Emulator. Auf einem echten Gerät gibt es jedoch eine richtige Liste zurück.
Verwenden Sie Google API System Image? – Anthony
Ja, natürlich, ich habe es in meiner Frage – meltedspark
angegeben. Nur um sicher zu sein (da ich keine tiefe Erfahrung in diesem Thema habe), hast du das "Google APIs Item x86 System Image" benutzt, um dein virtuelles Gerät zu erstellen, und nicht nur "Artikel x86 Systembild"? Ich habe nicht gesehen, wo Sie dies angegeben haben (möglicherweise indirekt) – Anthony