我試圖登錄到使用GoogleAccountCredential爲驗證我的應用程序獲取的OAuth 2.0訪問令牌:未能在Android模擬器
mGoogleAccountCredential = GoogleAccountCredential.usingOAuth2(context, Arrays.asList(Scopes.EMAIL, Scopes.PLUS_LOGIN));
mGoogleAccountCredential.setSelectedAccountName(accountName);
String token = mGoogleAccountCredential.getToken();
它可以在真實設備就好了,但在Android模擬器mGoogleAccountCredential.getToken()
失敗但下列情況除外:
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)
- 谷歌播放目前服務於模擬器(
GoogleApiAvailability.isGooglePlayServicesAvailable(context)
返回0) accountName
設置正確傳遞給setSelectedAccountName
(設置爲"[email protected]"
)- 所有權限,依賴條件時,並在項目中存在的結構(如事實上,它適用於所有的真實設備)
任何線索爲什麼它不在仿真器上工作?
UPD:
在谷歌的代碼挖了一下後:發生在setSelectedAccountName(accountName)
方法的問題。此方法要求GoogleAccountManager
給他一個與給定帳戶名稱關聯的帳戶。如果沒有這樣的帳戶,帳戶名被設置爲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
,反過來,越過所有的現有帳戶,他們的名字比較給定的帳戶名。如果有匹配,則返回相應的帳戶:
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");
}
的事情是,getAccounts()
回報在模擬器空數組。然而,在真實的設備上,它會返回一個正確的列表。
您是否使用Google API系統映像? – Anthony
當然,我在我的問題中指定了它 – meltedspark
爲了確保(因爲我對此主題的經驗不深),您是否使用「Google API項目x86系統映像」構建虛擬設備,而不僅僅是「項目x86系統映像」?我沒有看到您指定的位置(可能是間接的) – Anthony