Получение адреса электронной почты владельца телефона красиво
Я хочу, чтобы пользователь предоставил мне свой адрес электронной почты, не набрав его. В идеале, было бы текстовое поле, в котором пользователь мог бы либо ввести адрес электронной почты, либо нажать кнопку, чтобы автозавершить его.
В более раннем вопросе Роман Нурик предлагает использовать AccountManager для этого, но для этого требуется, чтобы мое приложение использовало привилегию GET_ACCOUNTS; мое приложение сможет получить доступ ко всем учетным записям пользователя на устройстве, включая их учетные записи Facebook/Twitter. Это разрешение кажется слишком широким для того, что я хочу.
Есть ли лучший способ справиться с этим, что не требует предоставления моего приложения такого сверхмощного разрешения?
Ответы
Ответ 1
Я знаю, что слишком поздно, но это может быть полезно для других.
Я думаю, что лучший способ автоматически заполнить поле электронной почты сейчас - использовать AccountPicker
Если ваше приложение имеет разрешение GET_ACCOUNTS и имеется только одна учетная запись, вы сразу получите его. Если в вашем приложении его нет или имеется несколько учетных записей, пользователи получают приглашение, чтобы они могли авторизовать действие или нет.
Ваше приложение должно включать библиотеку com.google.android.gms:play-services-auth
Google Play com.google.android.gms:play-services-auth
но не требует никаких разрешений.
Весь этот процесс завершится с ошибкой в более старых версиях Android (требуется 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);
}
}
Ответ 2
Действительно, вы не только не сможете сделать это без GET_ACCOUNTS, информация, которую вы хотите, существует только в данных учетной записи пользователя (Google).
На моем телефоне Sprint присваивание адреса владельца "владелец" [email protected]
, и это можно увидеть с помощью getprop
из оболочки. Но это не мой основной адрес электронной почты, или даже тот, который я когда-либо использовал/проверял. То, что вы хотите, - это мой адрес gmail, который хранится в данных учетной записи Android.
На самом деле вы хотите, чтобы один из двух - это еще одна причина, по которой вам нужны GET_ACCOUNTS. Если вы попросите мой адрес электронной почты, вы должны разрешить мне выбирать из двух учетных записей @gmail.com, которые я настроил на устройстве. I знать, какой из них является моим "предпочтительным" (хотя и даже контекстуальным), но AFAIK не рассматривается системой как более "первичный" или "по умолчанию", чем другой.
Ответ 3
Альтернативным подходом может быть поиск имени пользователя Google, связанного с устройством, из которого вы можете восстановить адрес [email protected]
, но для этого все еще требуется использовать AccountManager. См. Доступ к идентификатору/имени пользователя учетной записи Google через Android.
Ответ 4
Невозможно получить доступ к информации учетной записи пользователя (электронной почты), не запрашивая разрешения GET_ACCOUNTS.: -)