Подтвердить что ты не робот

Android: получить идентификатор пользователя, не требуя правдоподобных (для пользователя) разрешений?

Чтобы управлять пользовательскими настройками, в настоящее время я захватываю имя пользователя google (фактически адрес электронной почты, который они зарегистрировали на устройстве), и используя (хэш), который как "идентификатор пользователя", чтобы различать разные пользователи. Что-то вроде того, что описано здесь.

Все работает отлично, но некоторые пользователи (по понятным причинам) испуганы с помощью любого разрешения, которое, похоже, придает приложению некоторую злую силу, чтобы тралить через свою учетную информацию или контакты.

EDIT: эта проблема еще более острая, когда Google теперь реализовал Группы разрешений в Android 6 сценарий времени выполнения. Они поместили GET_ACCOUNTS в группу разрешений CONTACTS. Итак, теперь, чтобы создать уникальный анонимный идентификатор пользователя, пользователю необходимо предоставить диалог, в котором говорится:

Разрешить этому приложению доступ к вашим контактам? | Запретить | Разрешить |

Как обманчиво это? Мое приложение не хочет получать доступ к контактам, но пользователю предлагается предоставить разрешение на доступ к контактам для этого приложения! Да, есть возможность объяснить пользователю отдельный диалог, что на самом деле доступ к контактам НЕ требуется, но затем они все равно получают диалог системы запаса, который просит их предоставить разрешение на доступ к контактам... естественно, они подумает: "Почему меня просят предоставить это разрешение, если доступ к контактам не требуется?" и "действительно ли я доверяю разработчику?" Говорят, что доступ к контактам не требуется, но это правда? "... очень запутанный и очень плохой пользовательский опыт ИМХО (и мнение другие тоже).

Я предпочел бы просто избежать всех этих хлопот и путаницы и получить уникальный идентификатор пользователя без особых разрешений.

Итак, есть ли в SDK функция или метод запаса, который будет возвращать уникальный пользовательский идентификатор для пользователя без каких-либо дополнительных разрешений? Я немного удивлен, если этого не происходит, потому что, по-видимому, это довольно обычная вещь, чтобы хотеть... иметь идентификатор пользователя для управления пользователями приложений.

Две точки:

(a) Мне нужен только анонимный идентификатор пользователя... На самом деле мне не нужен адрес электронной почты пользователя, и я бы не хотел, чтобы пользовательский адрес электронной почты. Поэтому я не понимаю, почему Google не может предоставить метод getUserID(), который возвращает уникальный анонимный идентификатор, не предоставляя специальные разрешения для приложения.

(b) Он должен быть идентификатором пользователя, а не идентификатором устройства, чтобы он работал на всех пользовательских устройствах, зарегистрированных в одной учетной записи google.

Спасибо.

4b9b3361

Ответ 1

Если вы используете Службы Google Play, вы можете получить тип учетной записи и имя учетной записи без каких-либо дополнительных разрешений.

Сначала добавьте следующую зависимость для build.gradle:

compile 'com.google.android.gms:play-services-auth:8.4.0'

Затем запустите настройку выбора учетной записи:

Intent intent = AccountPicker.newChooseAccountIntent(null, null,
    new String[]{GoogleAuthUtil.GOOGLE_ACCOUNT_TYPE},
    false, null, null, null, null);

try {
  startActivityForResult(intent, REQUEST_CODE_EMAIL);
} catch (ActivityNotFoundException e) {
  // This device may not have Google Play Services installed.
  // TODO: do something else
}

Наконец, переопределите onActivityResult, чтобы получить тип учетной записи и имя учетной записи:

@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);
    String accountType = data.getStringExtra(AccountManager.KEY_ACCOUNT_TYPE);
    // TODO: do something with the accountName
    return;
  }
  super.onActivityResult(requestCode, resultCode, data);
}

источник: fooobar.com/questions/4143/...

Ответ 2

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

Ваше приложение должно включать Службы 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);
        }
    }

Источник приведенной выше информации: Этот ответ на SO - к аналогичному, но немного другому вопросу, заданному в прошлом.

Этот пост - также имеет некоторые хорошие подходы, которые будут служить вашей цели.

Ответ 3

Вы можете использовать рекламный идентификатор Google в качестве UUID, но это не перекрестное устройство (пока?):

https://support.google.com/googleplay/android-developer/answer/6048248?hl=en

Это, по крайней мере, избавится от запроса на страшный запрос.

Я не верю, что у Android/Google есть UUID кросс-устройства, который не требует разрешения, хотя Doubleclick от Google предположительно разрабатывал его.

Ответ 4

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