Если Android-приложение не запрашивает разрешение на камеру, экран съемки может оставаться черным, возвращать отказ или ничего не делать. Одной записи permission в manifest недостаточно: опасное разрешение запрашивается во время работы и только в понятном пользовательском контексте.
Не отправляйте пользователя в системные настройки при первом запуске без объяснения. Сначала приложение должно проверить текущее состояние, показать назначение функции и корректно обработать как согласие, так и отказ.
Проверьте текущее состояние permission
Диалог не показывается повторно в некоторых состояниях, поэтому отсутствие окна не всегда означает, что запрос не вызван.
- Разрешение уже выдано, и диалог закономерно не появляется.
- Пользователь отказал, а приложение не показывает повторное объяснение.
- Запрос запускается из неактивного Activity или слишком рано.
- Камера нужна WebView, но native callback не передает решение.
Почему возникает проблема
Manifest, runtime API и жизненный цикл экрана должны работать согласованно.
- CAMERA отсутствует в итоговом merged manifest.
- Код проверяет permission, но не запускает request flow.
- Callback результата не зарегистрирован или потерян при пересоздании Activity.
- После постоянного отказа система больше не показывает диалог.
- WebView getUserMedia не обрабатывается WebChromeClient.
Пошаговая диагностика
Проверяйте чистую установку и отдельные состояния отказа на реальном устройстве.
- Изучите merged manifest release-сборки.
- Проверьте фактическое состояние permission перед открытием камеры.
- Добавьте лог вызова launcher и callback без изображения пользователя.
- Повторите первый отказ, повторный запрос и постоянный отказ.
- Проверьте lifecycle, поворот экрана и возврат из настроек.
Запрашивайте разрешение в момент действия
Пользователь лучше понимает запрос после нажатия «Сканировать» или «Сделать фото».
- До запроса показывается краткое назначение камеры.
- После согласия функция запускается один раз.
- После отказа доступен безопасный альтернативный путь.
- Ссылка на настройки показывается только когда системный диалог недоступен.
Как исправить проблему
Исправьте manifest и единый flow проверки, запроса и результата.
- Добавьте permission в правильный manifest и вариант сборки.
- Используйте актуальный контракт runtime permission.
- Обрабатывайте granted, denied и permanently denied отдельно.
- Восстанавливайте состояние после пересоздания Activity.
- Для WebView явно обработайте запрос web-origin с проверкой домена.
Как проверить результат
- На чистой установке запрос появляется после действия пользователя.
- Согласие открывает камеру без повторного окна.
- Отказ не приводит к зависанию или черному экрану.
- Возврат из настроек обновляет состояние функции.
Типичные ошибки
- Запрашивать камеру сразу при старте приложения.
- Считать запись в manifest достаточной.
- Повторять запрос бесконечно после отказа.
- Выдавать WebView-доступ любому origin.
Как предотвратить повторение
- Тестируйте permission matrix на нескольких версиях Android.
- Проверяйте merged manifest в CI.
- Храните минимум данных камеры и объясняйте назначение.
- Добавьте UI-тест отказа и возврата из настроек.
Когда нужна помощь
Если Android-приложение не запрашивает камеру, я проверю manifest, runtime flow, lifecycle и WebView, исправлю состояния согласия и отказа и восстановлю функцию без лишних разрешений.