Как работать с камерой в 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‑логикой.