Получение адреса электронной почты владельца Android приятно
Я хочу, чтобы пользователь мог предоставить мне свой адрес электронной почты, не вводя его. В идеале, было бы текстовое поле, в котором пользователь мог бы либо ввести адрес электронной почты, либо нажать кнопку для его автозаполнения.
В предыдущем вопросе Роман Нурик предложил использовать AccountManager для решения этой проблемы, но для этого необходимо, чтобы мое приложение использовало привилегию GET_ACCOUNTS; моё приложение могло бы получить доступ ко всем учетным записям пользователя на устройстве, включая их учетные записи Facebook/Twitter. Это разрешение кажется слишком широким для того, что я хочу.
Есть ли лучший способ справиться с этим, не требующий предоставления моему приложению такого разрешения?
5 ответов
На самом деле, вы не только не можете сделать это без GET_ACCOUNTS, необходимая информация существует только в данных учетной записи пользователя (Google).
На моем телефоне Sprint адрес "владельца" присваивается myusername@sprintpcs.com
и это можно увидеть с помощью getprop
из скорлупы. Но это не мой основной адрес электронной почты или даже тот, который я когда-либо использовал / проверял. Вам нужен мой адрес Gmail, который хранится в данных учетной записи Android.
На самом деле, вы хотите один из двух - это еще одна причина, по которой вам нужен GET_ACCOUNTS. Если вы собираетесь запросить мой адрес электронной почты, вам нужно разрешить мне выбрать одну из двух учетных записей @gmail.com, которые я настроил на устройстве. Я знаю, какой из них является моим "предпочтительным" (хотя и контекстуальным), но AFAIK не считается системой более "первичным" или "стандартным", чем другой.
Я знаю, что слишком поздно, но это может быть полезно для других.
Я думаю, что лучший способ автоматически заполнить поле электронной почты сейчас с помощью AccountPicker
Если ваше приложение имеет разрешение GET_ACCOUNTS и есть только одна учетная запись, вы сразу получите его. Если в вашем приложении его нет или имеется несколько учетных записей, пользователи получают подсказку, чтобы они могли авторизовать действие или нет.
Ваше приложение должно включать Сервисы Google Play, но не требует никаких разрешений.
Весь этот процесс завершится с ошибкой в более старых версиях Android (требуется 2.2+), или если Google Play недоступен, поэтому вам следует рассмотреть этот случай.
Вот базовый пример кода:
private static final int REQUEST_CODE_EMAIL = 1;
private TextView email = (TextView) findViewById(R.id.email);
// ...
try {
Intent intent = AccountPicker.newChooseAccountIntent(null, null,
new String[] { GoogleAuthUtil.GOOGLE_ACCOUNT_TYPE }, false, null, null, null, null);
startActivityForResult(intent, REQUEST_CODE_EMAIL);
} catch (ActivityNotFoundException e) {
// TODO
}
// ...
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == REQUEST_CODE_EMAIL && resultCode == RESULT_OK) {
String accountName = data.getStringExtra(AccountManager.KEY_ACCOUNT_NAME);
email.setText(accountName);
}
}
Альтернативный подход может состоять в том, чтобы найти имя пользователя Google, связанное с устройством, из которого вы можете восстановить user@gmail.com
адрес, но это все еще требует использования AccountManager. См. Доступ к идентификатору учетной записи Google / имени пользователя через Android.
Поскольку принятый ответ устарел, вы можете использовать новый подход:
val result = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) {
if (it.resultCode == Activity.RESULT_OK) {
val accountName = it.data?.getStringExtra(AccountManager.KEY_ACCOUNT_NAME)
}
}
val options = AccountChooserOptions.Builder()
.setAlwaysShowAccountPicker(true)
.build()
result.launch(AccountPicker.newChooseAccountIntent(options))
Нет хорошего способа получить доступ к информации об учетной записи пользователя (электронной почте) без запроса разрешения GET_ACCOUNTS.:-)