Сайт разработчика Александр Климова

/* Моя кошка замечательно разбирается в программировании. Стоит мне объяснить проблему ей - и все становится ясно. */
John Robbins, Debugging Applications, Microsoft Press, 2000

AccountManager

Иногда разработчик хочет отслеживать пользователя. Первый вариант, который приходит в голову - попросить его ввести какие-то данные о себе и сохранить их где-нибудь. Но просить пользователя повторять эту процедуру при покупке нового устройства не самая лучшая идея. Кроме того, вы не можете гарантировать уникальность данных. Второй вариант - запомнить идентификатор телефона. Но пользователи иногда пользуются двумя телефонами, планшетами и т.д. и тут одним идентификатором не обойдёшься. Опять проблема.

Третий вариант – использовать класс 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. На самом деле, у класса много других возможностей. Например, вы можете добавить новую учётную запись и управлять ею.

Реклама