Решение: 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 – Учебник


