Решение: onRequestPermissionsResult() не вызывается в Android M
Пройдите тест, узнайте какой профессии подходите
Быстрый ответ
Для того чтобы гарантировать вызов функции onRequestPermissionsResult
, нужно правильно переопределить её в той Activity или Fragment, откуда произошёл запрос на разрешение:
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
if (requestCode == YOUR_REQUEST_CODE) {
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
// Отлично, разрешение получено. Можем продолжать работу.
} else {
// К сожалению, разрешение нам не предоставили. Нужно придумать план "Б".
}
}
}
Не забудьте использовать requestPermissions
из фрагмента, если именно он осуществляет запрос. Это необходимо, чтобы метод обратного вызова onRequestPermissionsResult
был вызван в контексте этого самого фрагмента. А ещё обязательно проверьте, что YOUR_REQUEST_CODE
в вашем методе обратного вызова совпадает с кодом запроса.
Усовершенствование вызова requestPermissions
Место, откуда идёт запрос на разрешение, влияет на выбор метода requestPermissions
. Используйте ActivityCompat.requestPermissions()
, если запрос выполняется из Activity, и Fragment.requestPermissions()
, если запрос осуществляется из Fragment. Это гарантирует вызов onRequestPermissionsResult()
в нужном контексте.
Неконсистентные флаги в манифесте
Некоторые флаги в манифесте могут мешать вызову onRequestPermissionsResult()
:
android:noHistory="true"
: Activity не будет сохраняться в истории задач, что приведёт к отсутствию обратного вызова. Если флагnoHistory
не критичен для вашего приложения, попробуйте удалить его.android:excludeFromRecents="true"
: Этот флаг к сожалению, тоже может помешать обратному вызову. Вместо него рекомендуется использоватьfinishAndRemoveTask()
после принятия решения по разрешению для аналогичного эффекта.
Сигнатура метода играет ключевую роль
Важно тщательно проверять сигнатуру метода обратного вызова. Любая неточность в параметрах или опечатка могут привести к тому, что ожидаемый обратный вызов не произойдёт. Помните, что в программировании всё важно, вплоть до мельчайших деталей!
Поддержание цепочки ответственности
Следование принципу цепочки ответственности является ключевым. Реализация super.onRequestPermissionsResult()
в вашей активности и фрагменте позволит перенаправить любые необработанные запросы к вышестоящему компоненту.
Визуализация
Представим, что ваше приложение отправило запрос на разрешение системе.
- Вы формируете запрос:
requestPermissions()
- Система получает и обрабатывает запрос на разрешение.
- Вы ожидаете подтверждение или отказ в
onRequestPermissionsResult()
.
Но:
Система выполнила свою работу, ответа нет!
Возможные причины:
- Некорректная сигнатура метода.
- Запрос был отправлен не из того контекста (
Fragment
вместоActivity
). - В манифесте отсутствуют необходимые разрешения.
🛠 Решение: Тщательно проверьте сигнатуру, контекст отправка запроса и содержимое манифеста, чтобы гарантировать успешное получение ответа.
Тестирование? Да, на реальных устройствах
Тестирование на различных устройствах обеспечивает согласованность обработки запросов на разрешение. Разница в версиях операционной системы может привести к непредсказуемым проблемам, поэтому рекомендуется провести тестирование на реальных устройствах.
Поддержка бесперебойности работы
Организуйте механизм запроса разрешения так, чтобы этот процесс был гладким и без помех. После получения разрешения убедитесь, что в дальнейшей работе вашего приложения не возникнет препятствий.
Полезные материалы
- Разрешения на Android | Разработчики Android
- Запрос разрешений во время выполнения | Разработчики Android
- java – Различные разрешения в Android 6.0 – Stack Overflow
- Блог разработчиков Android: Обновление Google Play Services 8.1 и разрешения Android 6.0
- Runtime Permissions в Android 6.0 Marshmallow (Паттерны разработки Android Эпизод 3) – YouTube
- Модель разрешений Android – Учебник