/* Моя кошка замечательно разбирается в программировании. Стоит мне объяснить проблему ей - и все становится ясно. */
John Robbins, Debugging Applications, Microsoft Press, 2000
Иногда разработчик хочет отслеживать пользователя. Первый вариант, который приходит в голову - попросить его ввести какие-то данные о себе и сохранить их где-нибудь. Но просить пользователя повторять эту процедуру при покупке нового устройства не самая лучшая идея. Кроме того, вы не можете гарантировать уникальность данных. Второй вариант - запомнить идентификатор телефона. Но пользователи иногда пользуются двумя телефонами, планшетами и т.д. и тут одним идентификатором не обойдёшься. Опять проблема.
Третий вариант – использовать класс AccountManager. С разрешения пользователя, вы можете использовать AccountManager для извлечения имён учетных записей, которые пользователь хранит на устройстве. Имея полученную информацию, вы можете, например, автоматически заполнить форму с адресом электронной почты.
Само устройство может хранить несколько аккаунтов от разных сервисов. Вы можете отфильтровать результат по типам аккаунтов. Например, у Гугла аккаунт имеет тип "com.google", Twitter использует тип "com.twitter.android.auth.login".
Для извлечения информации требуется разрешение:
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
В приложении вы сначала получаете экземпляр AccountManager через метод get(), а затем можете вызвать список аккаунтов определённого типа через getAccountsByType().
Метод getAccountsByType() возвращает массив учётных записей. Если в массиве более одной учётной записи, то покажите пользователю диалоговое окно с запросом для выбора одного аккаунта.
Объект Account содержит имя учетной записи, для учетных записей Google – это адрес электронной почты, который вы можете использовать для автоматического заполнения полей или в качестве ключа в базе данных и т.д.
В других учётных записях в имени не обязательно может содержаться электронный адрес. Например, это может быть часть электронного адреса или просто имя пользователя.
public void onClick(View v){
AccountManager am = AccountManager.get(this); // current Context
//AccountManager am = (AccountManager) getSystemService(ACCOUNT_SERVICE); // видел такой способ
Account[] accounts = am.getAccountsByType("com.google");
Log.i("Account", accounts.length + "");
TextView tvInfo = (TextView)findViewById(R.id.textView1);
tvInfo.setText(accounts[0].name);
}
На эмуляторе скорее всего нет никаких аккаунтов, поэтому лучше проверять на устройстве. В большинстве случаев на телефоне есть аккаунт для Гугла. В логах я проверил количество аккаунтов, а в текстовом поле вывел имя аккаунта, который оказался моим электронным адресом.
Метод getAccounts() выводит все учётные записи, которые есть на устройстве.
public void onClick(View v){
AccountManager am = AccountManager.get(this); // current Context
TextView tvInfo = (TextView)findViewById(R.id.textView1);
Account[] accounts = am.getAccounts();
for(Account account: accounts)
{
tvInfo.append(account.name + "\n");
if(account.type.equalsIgnoreCase("com.google"))
{
//Что-то делаем
}
}
}
На моём устройстве оказалось три учётные записи. Чтобы понять, кому они принадлежат, я заменил account.name на account.toString() и получил следующий результат.
Account {[email protected], type=com.google} Account {[email protected], type=com.dropbox.android.account} Account {name=cat.vaska, type=com.skype,contacts.sync}
Теперь стало понятно.
Мы рассмотрели только базовый пример работы с AccountManager. На самом деле, у класса много других возможностей. Например, вы можете добавить новую учётную запись и управлять ею.