Sto cercando di accedere al mio applicazione utilizzando GoogleAccountCredential per l'autenticazione:Non riuscendo a recuperare l'accesso OAuth 2.0 gettone emulatore di Android
mGoogleAccountCredential = GoogleAccountCredential.usingOAuth2(context, Arrays.asList(Scopes.EMAIL, Scopes.PLUS_LOGIN));
mGoogleAccountCredential.setSelectedAccountName(accountName);
String token = mGoogleAccountCredential.getToken();
Funziona bene su dispositivi reali, ma l'emulatore Android mGoogleAccountCredential.getToken()
fallisce con la seguente eccezione:
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 Play Services presenti sull'emulatore (
GoogleApiAvailability.isGooglePlayServicesAvailable(context)
restituisce 0) 012.351.641,061 mila
accountName
è impostato e corretto quando passarono aisetSelectedAccountName
(insieme a"[email protected]"
)- tutte le autorizzazioni, dependecies ed esistono configurazioni nel progetto (come un dato di fatto, funziona su tutti i dispositivi reali)
Qualsiasi indizio perché non funziona sull'emulatore?
UPD:
Dopo aver scavato un po 'nel codice di Google: il problema si verifica in setSelectedAccountName(accountName)
metodo. Questo metodo richiede a GoogleAccountManager
di assegnargli un account associato al nome dell'account specificato. Se non c'è un conto ad esempio, il nome dell'account viene impostato null
:
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
, a sua volta, va oltre tutto l'account esistente e confronta i loro nomi per il nome dato conto. Se c'è una corrispondenza, l'account appropriato viene restituito:
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");
}
Il fatto è che i rendimenti getAccounts()
array vuoto sull'emulatore. Su un dispositivo reale, tuttavia, restituisce una lista corretta.
Utilizzi l'immagine del sistema API di Google? – Anthony
Sì, certo, l'ho specificato nella mia domanda – meltedspark
Solo per essere sicuro (dato che non ho una profonda esperienza in questo argomento), hai usato la "Immagine del sistema x86 Elemento API di Google" per costruire il tuo Dispositivo Virtuale, e non solo "Immagine del sistema x86 elemento"? Non ho visto dove hai specificato questo (forse indirettamente) – Anthony