Если Android-приложение не запрашивает разрешение на камеру, экран съемки может оставаться черным, возвращать отказ или ничего не делать. Одной записи permission в manifest недостаточно: опасное разрешение запрашивается во время работы и только в понятном пользовательском контексте.

Не отправляйте пользователя в системные настройки при первом запуске без объяснения. Сначала приложение должно проверить текущее состояние, показать назначение функции и корректно обработать как согласие, так и отказ.

Проверьте текущее состояние permission

Диалог не показывается повторно в некоторых состояниях, поэтому отсутствие окна не всегда означает, что запрос не вызван.

  • Разрешение уже выдано, и диалог закономерно не появляется.
  • Пользователь отказал, а приложение не показывает повторное объяснение.
  • Запрос запускается из неактивного Activity или слишком рано.
  • Камера нужна WebView, но native callback не передает решение.

Почему возникает проблема

Manifest, runtime API и жизненный цикл экрана должны работать согласованно.

  • CAMERA отсутствует в итоговом merged manifest.
  • Код проверяет permission, но не запускает request flow.
  • Callback результата не зарегистрирован или потерян при пересоздании Activity.
  • После постоянного отказа система больше не показывает диалог.
  • WebView getUserMedia не обрабатывается WebChromeClient.

Пошаговая диагностика

Проверяйте чистую установку и отдельные состояния отказа на реальном устройстве.

  1. Изучите merged manifest release-сборки.
  2. Проверьте фактическое состояние permission перед открытием камеры.
  3. Добавьте лог вызова launcher и callback без изображения пользователя.
  4. Повторите первый отказ, повторный запрос и постоянный отказ.
  5. Проверьте lifecycle, поворот экрана и возврат из настроек.

Запрашивайте разрешение в момент действия

Пользователь лучше понимает запрос после нажатия «Сканировать» или «Сделать фото».

  • До запроса показывается краткое назначение камеры.
  • После согласия функция запускается один раз.
  • После отказа доступен безопасный альтернативный путь.
  • Ссылка на настройки показывается только когда системный диалог недоступен.

Как исправить проблему

Исправьте manifest и единый flow проверки, запроса и результата.

  1. Добавьте permission в правильный manifest и вариант сборки.
  2. Используйте актуальный контракт runtime permission.
  3. Обрабатывайте granted, denied и permanently denied отдельно.
  4. Восстанавливайте состояние после пересоздания Activity.
  5. Для WebView явно обработайте запрос web-origin с проверкой домена.

Как проверить результат

  • На чистой установке запрос появляется после действия пользователя.
  • Согласие открывает камеру без повторного окна.
  • Отказ не приводит к зависанию или черному экрану.
  • Возврат из настроек обновляет состояние функции.

Типичные ошибки

  • Запрашивать камеру сразу при старте приложения.
  • Считать запись в manifest достаточной.
  • Повторять запрос бесконечно после отказа.
  • Выдавать WebView-доступ любому origin.

Как предотвратить повторение

  • Тестируйте permission matrix на нескольких версиях Android.
  • Проверяйте merged manifest в CI.
  • Храните минимум данных камеры и объясняйте назначение.
  • Добавьте UI-тест отказа и возврата из настроек.

Когда нужна помощь

Если Android-приложение не запрашивает камеру, я проверю manifest, runtime flow, lifecycle и WebView, исправлю состояния согласия и отказа и восстановлю функцию без лишних разрешений.