Запрос разрешений, когда пользователь нажал "Больше не спрашивать"
По нажатию на определённую кнопку (например, "Определить местоположение") приложение запрашивает нужные разрешения у пользователя. Соответственно, он может принять, отклонить или отклонить и запретить спрашивать в дальнейшем. Если будет выбран последний вариант, то такое окошко с запросом разрешений уже не будет появляться. Так как сообщать об отсутствии разрешений и предоставлять возможность их дать всё равно нужно, то в случае отсутствия нужных разрешений я вывожу настроенное мной диалоговое окно с текстом вроде "Нажмите сюда, чтобы перейти в настройки и дать нужные разрешения". Только вот если пользователь ещё не нажал "Больше не показывать", то одновременно выскакивает и системное окошко с запросом разрешений и сделанное мной диалоговое окно. Собственно вопрос: как проверять, нажал ли пользователь "Больше не показывать" и выскакивает ли у него системное окошко с запросом или нет? Чтобы показывать свой диалог только в случае, если пользователь не увидит прямой запрос разрешений. Или же в таких случаях делается как-то по-другому? Может вообще можно убрать пункт "Больше не показывать" из системного окошка?
Ответы (3 шт):
Может вообще можно убрать пункт "Больше не показывать" из системного окошка?
Нет.
как проверять, нажал ли пользователь "Больше не показывать" и выскакивает ли у него системное окошко с запросом или нет?
Вы можете проверить методом shouldShowRequestPermissionRationale в своем onRequestPermissionsResult.
P.S. Для того чтобы узнать поставил ли пользователь галочку "Больше не спрашивать", нужно вызывать данный метод в onRequestPermissionsResult, а не перед проверкой разрешений. Иначе он будет возвращать false и при первом запросе разрешения.
Я использую библиотеку https://github.com/florent37/RuntimePermission
Пример использования такой:
RuntimePermission(requireActivity())
.onResponse {
if (it.foreverDenied.isNotEmpty())
/*Отображаем диалог с переходом в настройки*/
}
.request(Manifest.permission.CAMERA) // например, камера
.onAccepted { /*разрешение получено*/ }
.onDenied { /*разрешение не получено*/ }
.ask()
Google разработал специальные правила запроса "опасных" разрешений которые обязан(!) соблюдать разработчик.
Разберем их вкратце.
- При начале работы вы анализируете есть ли у вас нужное разрешение методом
checkSelfPermission, если есть, то продолжаете штатную работу приложения. - Далее вы анализируете, а не отклонил ли пользователь уже первое предложение в стандартном диалоге системы методом
shouldShowRequestPermissionRationale. - Если нет, то вы запрашиваете разрешение методом
checkSelfPermission. - Если да, то вы понимаете, что у вас остался только один шанс получить нужное разрешение и показываете пользователю диалоговое окно (или делаете это иным способом) с подробным описанием зачем и почему вам нужно данное разрешение. Диалог содержит также 2 кнопки: "Запрос разрешения" и "Отмена" (или "Нет спасибо не надо"). Через диалог происходит повторный запрос на получение разрешения.
- Результаты запроса приходят в перегруженный метод
onRequestPermissionsResultи в случае успеха вы разблокируете необходимые для работы элементы интерфейса.
Все! Нельзя больше пользователю навязывать какие-то предложения и тем более перекрывать экран диалоговым окном с надписью "идите за разрешением туда", то есть речь идет о деликатном отношении к пользователю.