Как работать с камерой в Android 11 — практическое руководство

Коротко: Android 11 вводит одноразовые разрешения и автосброс, concurrent camera, точный zoom и платформенные API для эффектов глубины — используйте CameraX для большинства задач, проверяйте CameraCharacteristics/StreamConfigurationMap и обрабатывайте one‑time/auto‑reset разрешения.

Что важно знать (кратко)

  • Разрешения: поддерживайте сценарии «Only this time» и автосброс — проверяйте и повторно запрашивайте CAMERA/RECORD_AUDIO при запуске функционала. Используйте shouldShowRequestPermissionRationale() для объяснений пользователю.
  • Concurrent camera: перед открытием нескольких камер проверяйте возможности устройства через getConcurrentCameraIds() и SCALER_MANDATORY_CONCURRENT_STREAM_COMBINATIONS; готовьте fallback (понижение разрешения).
  • Новые API: CONTROL_ZOOM_RATIO даёт плавающий коэффициент зума; платформа добавила улучшения для глубины/боке. Для большинства задач берите готовые абстракции CameraX, для тонкой оптимизации — Camera2/NDK.

Тестируйте сценарии «приложение не использовалось долго» — автосброс разрешений приводит к неожиданным отказам камеры у пользователей.

Настройки, форматы и рекомендации

  • Форматы: для превью и анализа — YUV_420_888 (ImageReader); если не нужно читать байты — используйте PRIVATE surface для скорости. Для фото — JPEG по умолчанию; RAW/DNG применяйте только если устройство поддерживает RAW (проверьте capabilities).
  • Выбор разрешения: приоритетуйте частоту кадров и низкую задержку для превью (например 720p/1080p), а для снимков — максимальное доступное, если это не тормозит обработку. Используйте StreamConfigurationMap.getOutputSizes() или CameraX ResolutionSelector/Viewport для автоматического подбора.
  • Видео: по умолчанию H.264; HEVC используйте только при гарантированной поддержке на устройстве. Помните про тепловое троттлинг при высоких разрешениях/FPS.
  • EXIF и конфиденциальность: при шаринге снимков учитывайте очистку геометок, если приёмник не имеет права на местоположение.

Не полагайтесь на наличие RAW/Full support на всех устройствах — проверяйте hardware level и REQUEST_AVAILABLE_CAPABILITIES.

Начните проект с CameraX: она решает 80% проблем (rotation, разрешения, lifecycle). Переходите на Camera2/NDK только при необходимости.

Отладка: типичные проблемы и готовые решения

  • Камера не открывается / ERROR_MAX_CAMERAS_IN_USE
    Действия: отслеживайте CameraManager.AvailabilityCallback; всегда закрывайте CameraDevice и CaptureSession в onPause/onStop; перед открытием проверьте, не держит ли другой компонент камеру. Для multi‑cam проверьте поддержку комбинации через getConcurrentCameraIds().
  • Чёрный превью / frozen preview
    Проверки: соответствие размеров Surface и preview, совместимость комбинации output‑ов через StreamConfigurationMap, не превышено ли число подключённых Surface. Решение: выбрать совместимые размеры или ограничить выходы.
  • Поворот/зеркальность кадров
    Решение: учитывайте SENSOR_ORIENTATION и rotation устройства; выставляйте JPEG_ORIENTATION и для Preview используйте TargetRotation / PreviewView трансформацию.
  • One‑time разрешение / автосброс
    UX: при отказе показывайте rationale и кнопку перехода в настройки; при повторном запуске автоматически повторно запрашивайте разрешения перед использованием камеры.
  • Нет RAW / ограниченный Camera2 support
    Проверка: CameraCharacteristics.REQUEST_AVAILABLE_CAPABILITIES и supportedHardwareLevel; предложите «Pro via JPEG» как fallback.
  • Большие задержки / OOM при серийной съёмке
    Решение: асинхронная запись на фон, ограничение числа одновременно удерживаемых Image (acquireLatestImage для анализа), использование PRIVATE surfaces.

Частые ошибки

  • Не закрывают CameraDevice/CaptureSession при остановке Activity — приводит к блокировке камеры.
  • Игнорируют one‑time и auto‑reset — приложение внезапно теряет доступ.
  • Неправильный подбор разрешений — приводи к чёрному превью или падениям на некоторых устройствах.
  • Попытки одновременно открыть камеры без проверки поддерживаемых комбинаций.

FAQ

  • Нужно ли везде реализовывать RAW?
    Только если вы целитесь на устройства с FULL support; иначе предлагайте JPEG‑fallback для совместимости.
  • Как быстро проверить, поддерживает ли устройство concurrent camera?
    Используйте CameraManager.getConcurrentCameraIds() и проверяйте SCALER_MANDATORY_CONCURRENT_STREAM_COMBINATIONS.
  • CameraX или Camera2 — что выбрать?
    CameraX для быстрого старта и стандартных кейсов; Camera2/NDK — когда нужен полный контроль и оптимизация производительности.

Если хотите, подготовлю чек‑лист тестов (manual + автоматических) или пример модуля на CameraX/Camera2 с обработкой разрешений и fallback‑логикой.