Почему разрешение WRITE_CONTACTS предоставляется без запроса? - PullRequest
1 голос
/ 12 февраля 2020

У меня есть 2 устройства с API 28 и приложение, которому требуется разрешение WRITE_CONTACTS. Я добавил его в манифест <uses-permission android:name="android.permission.WRITE_CONTACTS" />. В списке контактов в моем приложении, когда пользователь нажимает на удаление контакта, я проверил, есть ли разрешение, и запрос, если нет. Итак, в 1-м устройстве метод

public static boolean checkWriteContactsPermission(Context context) {
    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
        return true;
    }
    return ContextCompat.checkSelfPermission(context, Manifest.permission.WRITE_CONTACTS) == PackageManager.PERMISSION_GRANTED;
}

возвращает true, в то же время в 2-м устройстве возвращается false. Я не запрашиваю это разрешение ранее. Почему это работает по-другому?

1 Ответ

1 голос
/ 12 февраля 2020

Android Разрешения делятся на Разрешения группы , WRITE_CONTACTS входит в группу разрешений Contacts. если вы уже запросили другое разрешение в той же группе, вам фактически предоставляются разрешения для всей группы. Поэтому, если вы уже запросили и получили разрешение на READ_CONTACTS, вы получите WRITE_CONTACTS бесплатно.

Но группы могут меняться между различными версиями Android, см. Эту часть в связанные документы:

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

И затем:

Внимание! В будущих версиях Android SDK может быть перемещено определенное разрешение из одной группы в другую. Поэтому не основывайте логи вашего приложения c на структуре этих групп разрешений.

Например, READ_CONTACTS находится в той же группе разрешений, что и WRITE_CONTACTS с Android 8.1 (уровень API 27). Если ваше приложение запрашивает разрешение READ_CONTACTS, а затем запрашивает разрешение WRITE_CONTACTS, не думайте, что система может автоматически предоставить разрешение WRITE_CONTACTS.

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