Получение адреса электронной почты владельца Android приятно - PullRequest
42 голосов
/ 28 июня 2011

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

В предыдущем вопросе Роман Нурик предлагает использовать AccountManager для решения этой проблемы, но для этого моему приложению необходимо использовать привилегию GET_ACCOUNTS;моё приложение могло бы получить доступ ко всем учетным записям пользователя на устройстве, включая их учетные записи Facebook / Twitter.Это разрешение кажется слишком широким для того, что я хочу.

Есть ли более хороший способ справиться с этим, который не требует предоставления моему приложению такого сверхпрочного разрешения?

Ответы [ 4 ]

116 голосов
/ 18 октября 2013

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

Я думаю, что лучший способ автоматического заполнения поля электронной почты сейчас - использовать 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);
        }
    }
19 голосов
/ 06 июля 2011

Действительно, вы не только не можете сделать это без GET_ACCOUNTS, необходимая информация существует только в данных учетной записи пользователя (Google).

На моем телефоне Sprint адрес «владельца» назначается спринту:myusername@sprintpcs.com, и это можно увидеть, используя getprop из оболочки.Но это не мой основной адрес электронной почты или даже тот, который я когда-либо использовал / проверял.Что вы хотите - это мой адрес электронной почты, и он хранится в данных учетной записи Android.

На самом деле вы хотите один из двух -это еще одна причина, по которой вам нужно GET_ACCOUNTS.Если вы собираетесь запросить мой адрес электронной почты, вам нужно разрешить мне выбрать одну из двух учетных записей @ gmail.com, которые я настроил на устройстве. Я знаю, какой из них является моим "предпочтительным" (хотя даже это контекстуально), но AFAIK не рассматривается системой как более "первичный" или "по умолчанию", чем другой.

0 голосов
/ 06 июля 2011

Нет хорошего способа получить доступ к информации об учетной записи пользователя (электронной почте) без запроса разрешения GET_ACCOUNTS.: -)

0 голосов
/ 01 июля 2011

Альтернативный подход может заключаться в том, чтобы найти имя пользователя Google, связанное с устройством, с которого вы можете восстановить адрес user@gmail.com, но для этого по-прежнему необходимо использовать AccountManager. См. Доступ к идентификатору учетной записи Google / имени пользователя через Android .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...