próbuję się zalogować do mojej aplikacji przy użyciu GoogleAccountCredential do uwierzytelniania:Niezastosowanie się odzyskać OAuth 2.0 token dostępu na android emulator
mGoogleAccountCredential = GoogleAccountCredential.usingOAuth2(context, Arrays.asList(Scopes.EMAIL, Scopes.PLUS_LOGIN));
mGoogleAccountCredential.setSelectedAccountName(accountName);
String token = mGoogleAccountCredential.getToken();
to działa dobrze na prawdziwych urządzeniach, ale na android emulator mGoogleAccountCredential.getToken()
nie z następującym wyjątkiem:
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)
- Usługi Google Play obecne na emulatorze (
GoogleApiAvailability.isGooglePlayServicesAvailable(context)
powraca 0) accountName
jest ustawiony i prawidłowe, gdy przeszedł dosetSelectedAccountName
(ustawiony na"[email protected]"
)- wszystkie uprawnienia, dependecies i konfiguracje istnieć w projekcie (w rzeczywistości, to działa na wszystkich rzeczywistych urządzeń)
Dowolna wskazówka, dlaczego nie działa na emulatorze?
UPD:
Po wykopaniu trochę w kodzie Google: problem występuje w setSelectedAccountName(accountName)
metody. Ta metoda prosi o podanie konta związanego z daną nazwą konta GoogleAccountManager
. Jeśli nie ma takiego konta, nazwa konta jest ustawiona na 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
z kolei przechodzi nad wszystkimi istniejącego konta i porównuje ich nazw do podanej nazwy konta. Jeśli istnieje dopasowanie, odpowiednie konto jest zwracany:
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");
}
Chodzi o to, że getAccounts()
powraca pusta tablica na emulatorze. Na prawdziwym urządzeniu zwraca jednak właściwą listę.
Czy używasz obrazu systemu interfejsu API Google? – Anthony
Tak, oczywiście, podałem to na moje pytanie. – meltedspark
Po prostu, aby upewnić się (ponieważ nie mam głębokiego doświadczenia w tym temacie), użyłeś "Obrazu Systemu Elementów x86 dla Google API" do zbudowania swojego Wirtualnego Urządzenia, a nie tylko "Element System image x86"? Nie widziałem, gdzie to określono (może pośrednio). – Anthony