Получение адреса электронной почты владельца телефона красиво

Я хочу, чтобы пользователь предоставил мне свой адрес электронной почты, не набрав его. В идеале, было бы текстовое поле, в котором пользователь мог бы либо ввести адрес электронной почты, либо нажать кнопку, чтобы автозавершить его.

В более раннем вопросе Роман Нурик предлагает использовать 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.: -)