Запрос разрешений, когда пользователь нажал "Больше не спрашивать"

По нажатию на определённую кнопку (например, "Определить местоположение") приложение запрашивает нужные разрешения у пользователя. Соответственно, он может принять, отклонить или отклонить и запретить спрашивать в дальнейшем. Если будет выбран последний вариант, то такое окошко с запросом разрешений уже не будет появляться. Так как сообщать об отсутствии разрешений и предоставлять возможность их дать всё равно нужно, то в случае отсутствия нужных разрешений я вывожу настроенное мной диалоговое окно с текстом вроде "Нажмите сюда, чтобы перейти в настройки и дать нужные разрешения". Только вот если пользователь ещё не нажал "Больше не показывать", то одновременно выскакивает и системное окошко с запросом разрешений и сделанное мной диалоговое окно. Собственно вопрос: как проверять, нажал ли пользователь "Больше не показывать" и выскакивает ли у него системное окошко с запросом или нет? Чтобы показывать свой диалог только в случае, если пользователь не увидит прямой запрос разрешений. Или же в таких случаях делается как-то по-другому? Может вообще можно убрать пункт "Больше не показывать" из системного окошка?


Ответы (3 шт):

Автор решения: Dinario

Может вообще можно убрать пункт "Больше не показывать" из системного окошка?

Нет.

как проверять, нажал ли пользователь "Больше не показывать" и выскакивает ли у него системное окошко с запросом или нет?

Вы можете проверить методом shouldShowRequestPermissionRationale в своем onRequestPermissionsResult.

P.S. Для того чтобы узнать поставил ли пользователь галочку "Больше не спрашивать", нужно вызывать данный метод в onRequestPermissionsResult, а не перед проверкой разрешений. Иначе он будет возвращать false и при первом запросе разрешения.

→ Ссылка
Автор решения: Alex_Skvortsov

Я использую библиотеку https://github.com/florent37/RuntimePermission

Пример использования такой:

RuntimePermission(requireActivity())
    .onResponse {
        if (it.foreverDenied.isNotEmpty())
            /*Отображаем диалог с переходом в настройки*/
    }
    .request(Manifest.permission.CAMERA) // например, камера
    .onAccepted { /*разрешение получено*/ }
    .onDenied { /*разрешение не получено*/ }
    .ask()
→ Ссылка
Автор решения: Style-7

Google разработал специальные правила запроса "опасных" разрешений которые обязан(!) соблюдать разработчик.

Разберем их вкратце.

  1. При начале работы вы анализируете есть ли у вас нужное разрешение методом checkSelfPermission, если есть, то продолжаете штатную работу приложения.
  2. Далее вы анализируете, а не отклонил ли пользователь уже первое предложение в стандартном диалоге системы методом shouldShowRequestPermissionRationale.
  3. Если нет, то вы запрашиваете разрешение методом checkSelfPermission.
  4. Если да, то вы понимаете, что у вас остался только один шанс получить нужное разрешение и показываете пользователю диалоговое окно (или делаете это иным способом) с подробным описанием зачем и почему вам нужно данное разрешение. Диалог содержит также 2 кнопки: "Запрос разрешения" и "Отмена" (или "Нет спасибо не надо"). Через диалог происходит повторный запрос на получение разрешения.
  5. Результаты запроса приходят в перегруженный метод onRequestPermissionsResult и в случае успеха вы разблокируете необходимые для работы элементы интерфейса.

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

→ Ссылка