Я понимаю, что я сделал довольно беспорядок, открыв два SO-вопроса по существу той же теме. Итак, самое подходящее время для консолидации ответов. Я искал прямые методы getter/setter в GDAA, но нашел только «setter» - setAccountName()) - SO question 21583828 (на самом деле этого не делал, но Burcu мне помог).
С другой стороны, «добытчик» может быть заменен, получив название счета от «onActivityResult()» - SO question 21501829
И еще один так вопрос - это одно - по той же теме была решена, а также ,
Поэтому вывод:
- ПОЛУЧАЙсчетна от 'onActivityResult()
- заданного счета в' setAccountName()
- сохранить текущую учетную запись электронной почты вокруг, так что вы можете обнаружить новый один (если пользователь решит переключиться) и сбросить клиент учетных данных Google, если это необходимо.
UPDATE 2014-11-04:
Вот обертка, которую я использую, чтобы сохраняться и управлять счетами Google в моем приложении.
import android.accounts.Account;
import android.accounts.AccountManager;
import android.content.Context;
import android.content.SharedPreferences;
import android.preference.PreferenceManager;
import com.google.android.gms.auth.GoogleAuthUtil;
public class GooAccMgr {
private static final String ACC_NAME = "account_name";
public static final int FAIL = -1;
public static final int UNCHANGED = 0;
public static final int CHANGED = +1;
private String mCurrEmail = null; // cache locally
public Account[] getAllAccnts(Context ctx) {
return AccountManager.get(acx(ctx)).getAccountsByType(GoogleAuthUtil.GOOGLE_ACCOUNT_TYPE);
}
public Account getPrimaryAccnt(Context ctx) {
Account[] accts = getAllAccnts(ctx);
return accts == null || accts.length == 0 ? null : accts[0];
}
public Account getActiveAccnt(Context ctx) {
return email2Accnt(ctx, getActiveEmail(ctx));
}
public String getActiveEmail(Context ctx) {
if (mCurrEmail != null) {
return mCurrEmail;
}
mCurrEmail = ctx == null ? null : pfs(ctx).getString(ACC_NAME, null);
return mCurrEmail;
}
public Account email2Accnt(Context ctx, String emil) {
if (emil != null) {
Account[] accounts =
AccountManager.get(acx(ctx)).getAccountsByType(GoogleAuthUtil.GOOGLE_ACCOUNT_TYPE);
for (Account account : accounts) {
if (emil.equalsIgnoreCase(account.name)) {
return account;
}
}
}
return null;
}
/**
* Stores a new email in persistent app storage, reporting result
* @param ctx activity context
* @param newEmail new email, optionally null
* @return FAIL, CHANGED or UNCHANGED (based on the following table)
* OLD NEW SAVED RESULT
* ERROR FAIL
* null null null FAIL
* null new new CHANGED
* old null old UNCHANGED
* old != new new CHANGED
* old == new new UNCHANGED
*/
public int setEmail(Context ctx, String newEmail) {
int result = FAIL; // 0 0
String prevEmail = getActiveEmail(ctx);
if ((prevEmail == null) && (newEmail != null)) {
result = CHANGED;
} else if ((prevEmail != null) && (newEmail == null)) {
result = UNCHANGED;
} else if ((prevEmail != null) && (newEmail != null)) {
result = prevEmail.equalsIgnoreCase(newEmail) ? UNCHANGED : CHANGED;
}
if (result == CHANGED) {
mCurrEmail = newEmail;
pfs(ctx).edit().putString(ACC_NAME, newEmail).apply();
}
return result;
}
private Context acx(Context ctx) {
return ctx == null ? null : ctx.getApplicationContext();
}
private SharedPreferences pfs(Context ctx) {
return ctx == null ? null : PreferenceManager.getDefaultSharedPreferences(acx(ctx));
}
}
Hat-tip для Alex Lockwood для первоначального вдохновения. К сожалению, я не могу найти ссылку на его оригинальный код.
Спасибо, что работает, но моему приложению все еще нужно знать активную учетную запись (адрес электронной почты), которую пользователь выбрал в процессе. Управление им на уровне приложения (по моему ответу ниже) 1/messy, 2/требует разрешения GET_ACCOUNTS. Есть идеи? Кстати, метод, который вы упомянули, не существовал, когда я задавал вопрос. – seanpj
Теперь, 16-05-26. Просто позвони . mGoogleApiClient.clearDefaultAccountAndReconnect();/"clearDefaultAccountAndReconnect" устарел. –
@BrownsooHan Где вы это видите? В коде или документах нет указаний. – Bevor