it-roy-ru.com

Разрешение Android 6.0.GET_ACCOUNTS

Я использую это, чтобы получить разрешение:

if (ContextCompat.checkSelfPermission(context, Manifest.permission.GET_ACCOUNTS) != PackageManager.PERMISSION_GRANTED) {

    // Should we show an explanation?
    if (ActivityCompat.shouldShowRequestPermissionRationale(context, Manifest.permission.GET_ACCOUNTS)) {

    } else {
        // No explanation needed, we can request the permission.
        ActivityCompat.requestPermissions(context, new String[]{Manifest.permission.GET_ACCOUNTS}, PERMISSIONS_REQUEST_GET_ACCOUNTS);

        // MY_PERMISSIONS_REQUEST_READ_CONTACTS is an
        // app-defined int constant. The callback method gets the
        // result of the request.
    }
}

Но всплывающее диалоговое окно для разрешения спрашивает пользователя о доступе Контакты!?!?

В пре 6.0 в Play Store с 

<uses-permission Android:name="Android.permission.GET_ACCOUNTS"/>

запрос называется Identity и объясняет, что он мне нужен для получения учетной записи устройства. 

34
SpyZip

Это из-за групп разрешений. По сути, разрешения размещаются в разных группах, и все разрешения из этой группы будут предоставляться, если предоставлена ​​одна из них. 

Например. В разделе «Контакты» есть запись/чтение контактов и получение учетных записей, поэтому при запросе любого из них всплывающее окно запрашивает разрешения «Контакты».

Прочитайте: Все, что каждый разработчик Android должен знать о новом Android Runtime Permission


Правка 1

Просто подумал, что я добавлю соответствующие (не для получения учетных записей, но разрешений и групп) Информация об обновлении Oreo:
источник: https://developer.Android.com/about/versions/oreo/Android-8.0-changes.html#rmp

До Android 8.0 (уровень API 26), если приложение запрашивало разрешение во время выполнения и разрешение было предоставлено, система также неправильно предоставил приложению остальные разрешения, принадлежавшие тому же разрешение группы, и которые были зарегистрированы в манифесте.

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


31
Pararth

GET_ACCOUNTS был перемещен в группу разрешений CONTACTS в Android 6.0 . Хотя API позволяет нам предоставлять разрешения, пользователю (по крайней мере для Android 6.0) предлагается указать группы разрешений. Следовательно, пользователю будет выдана та же подсказка для GET_ACCOUNTS, что и для READ_CONTACTS или WRITE_CONTACTS.

18
CommonsWare

К счастью, это изменится в Android N 

http://developer.Android.com/preview/behavior-changes.html#perm

Разрешение GET_ACCOUNTS теперь устарело. Система игнорирует это разрешение для приложений, ориентированных на Android N.

6
ibmkhd

В Зефире все опасные разрешения принадлежат группам разрешений. 

Разрешение Android.permission.GET_ACCOUNTS принадлежит КОНТАКТАМ группе 

Вы можете найти больше информации об опасных разрешениях и их группах здесь:
https://developer.Android.com/guide/topics/security/permissions.html#normal-dangerous

2
Mattia Maestrini

Сначала я неправильно понял ваш вопрос. На этой странице http://developer.Android.com/guide/topics/security/permissions.html#perm-groups вы можете видеть, что GET_ACCOUNTS относится к контактам группы разрешений. Из-за этого вам предлагается разрешение на контакт.

1
Thomas R.

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

Intent intent = AccountPicker.newChooseAccountIntent(null, null,
                    new String[]{GoogleAuthUtil.GOOGLE_ACCOUNT_TYPE},
                    false, null, null, null, null);
try {
    startActivityForResult(intent, REQUEST_ACCOUNT_PICKER);
} catch (ActivityNotFoundException e) {
    // This device may not have Google Play Services installed.
}

Вам понадобится авторизация сервисов Google Play в зависимости от gradle

implementation com.google.Android.gms:play-services-auth:16.0.1

Это позволяет избежать всплывающего окна разрешения контактов для меня

0
Jer