API камеры

Фреймворк Android поддерживает различные камеры и функции камеры, доступные на устройствах, что позволяет вам снимать фото и видео в приложениях. В этом документе обсуждается быстрый и простой подход к записи изображений и видео, а также предлагается расширенный подход к созданию пользовательского опыта работы с камерой.

Примечание: На этой странице описывается класс Camera , который устарел. Мы рекомендуем использовать библиотеку CameraX Jetpack или, в особых случаях, класс camera2 . Как CameraX, так и Camera2 работают на Android 5.0 (API уровня 21) и выше.

См. следующие сопутствующие ресурсы:

Соображения

Прежде чем разрешить приложению использовать камеры на устройствах Android, следует рассмотреть несколько вопросов о том, как ваше приложение будет использовать эту аппаратную функцию.

  • Требование к камере . Использование камеры настолько важно для вашего приложения, что вы не хотите устанавливать его на устройстве без камеры? Если да, то необходимо указать требование к камере в манифесте .
  • Быстрый снимок или настраиваемая камера — как ваше приложение будет использовать камеру? Вас интересует только быстрая съёмка фото или видеоклипов, или ваше приложение предоставит новый способ использования камер? Для быстрого снимка или клипа рассмотрите возможность использования существующих приложений для камеры . Чтобы разработать настраиваемую функцию камеры, ознакомьтесь с разделом «Создание приложения для камеры» .
  • Требование к активным службам — когда ваше приложение взаимодействует с камерой? В Android 9 (API уровня 28) и более поздних версиях приложения, работающие в фоновом режиме, не могут получить доступ к камере. Поэтому камеру следует использовать либо когда приложение работает в активном режиме, либо как часть активной службы .
  • Хранилище . Предназначены ли изображения и видео, создаваемые вашим приложением, для просмотра только им самим или для общего доступа к ним, чтобы их могли использовать другие приложения, например, Галерея, другие медиа- и социальные приложения? Хотите ли вы, чтобы изображения и видео были доступны даже после удаления приложения? Ознакомьтесь с разделом «Сохранение медиафайлов», чтобы узнать, как реализовать эти возможности.

Основы

Фреймворк Android поддерживает захват изображений и видео через API android.hardware.camera2 или функцию Camera Intent . Вот соответствующие классы:

android.hardware.camera2
Этот пакет представляет собой основной API для управления камерами устройств. Его можно использовать для съёмки фотографий и видео при разработке приложения для камеры.
Camera
Этот класс представляет собой устаревший API для управления камерами устройств.
SurfaceView
Этот класс используется для предоставления пользователю предварительного просмотра изображения с камеры в реальном времени.
MediaRecorder
Этот класс используется для записи видео с камеры.
Intent
Тип действия намерения MediaStore.ACTION_IMAGE_CAPTURE или MediaStore.ACTION_VIDEO_CAPTURE можно использовать для захвата изображений или видео без прямого использования объекта Camera .

Манифестные заявления

Прежде чем начать разработку приложения с использованием API камеры, следует убедиться, что ваш манифест содержит соответствующие декларации, разрешающие использование оборудования камеры и других связанных функций.

  • Разрешение на использование камеры . Ваше приложение должно запросить разрешение на использование камеры устройства.
    <uses-permission android:name="android.permission.CAMERA" />

    Примечание: если вы используете камеру , вызывая существующее приложение камеры , вашему приложению не нужно запрашивать это разрешение.

  • Функции камеры . В вашем приложении также должно быть заявлено использование функций камеры, например:
    <uses-feature android:name="android.hardware.camera" />

    Список характеристик камеры см. в Справочнике характеристик .

    Добавление функций камеры в манифест приводит к тому, что Google Play блокирует установку вашего приложения на устройства, которые не оснащены камерой или не поддерживают указанные вами функции камеры. Подробнее об использовании фильтрации по функциям в Google Play см. в статье «Google Play и фильтрация по функциям» .

    Если ваше приложение может использовать камеру или функцию камеры для правильной работы, но не требует этого, вам следует указать это в манифесте, включив атрибут android:required и установив его в false :

    <uses-feature android:name="android.hardware.camera" android:required="false" />
  • Разрешение на хранение . Ваше приложение может сохранять изображения или видео на внешнем хранилище устройства (SD-карте), если оно предназначено для Android 10 (уровень API 29) или ниже и в манифесте указано следующее.
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
  • Разрешение на запись звука . Для записи звука с захватом видео ваше приложение должно запросить разрешение на запись звука.
    <uses-permission android:name="android.permission.RECORD_AUDIO" />
  • Разрешение на определение местоположения . Если ваше приложение добавляет к изображениям данные о местоположении GPS, необходимо запросить разрешение ACCESS_FINE_LOCATION . Обратите внимание: если ваше приложение предназначено для Android 5.0 (уровень API 21) или выше, необходимо также указать, что оно использует GPS устройства:

    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    ...
    <!-- Needed only if your app targets Android 5.0 (API level 21) or higher. -->
    <uses-feature android:name="android.hardware.location.gps" />

    Дополнительную информацию о получении местоположения пользователя см. в разделе Стратегии определения местоположения .

Использование существующих приложений камеры

Быстрый способ включить съёмку фото и видео в вашем приложении без написания большого количества кода — использовать Intent для вызова существующего приложения камеры Android. Подробности описаны в обучающих уроках «Снимать фотографии просто» и «Записывать видео просто» .

Создание приложения для камеры

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

Примечание: Данное руководство предназначено для устаревшего API Camera . Для новых или продвинутых приложений камеры рекомендуется использовать более новый API android.hardware.camera2 .

Общие шаги по созданию пользовательского интерфейса камеры для вашего приложения следующие:

  • Обнаружение и доступ к камере . Создайте код для проверки наличия камер и запроса доступа.
  • Создайте класс предварительного просмотра . Создайте класс предварительного просмотра камеры, расширяющий SurfaceView и реализующий интерфейс SurfaceHolder . Этот класс позволяет просматривать изображения с камеры в режиме реального времени.
  • Создайте макет предварительного просмотра . Как только у вас появится класс предварительного просмотра камеры, создайте макет вида, который будет включать в себя предварительный просмотр и необходимые элементы управления пользовательским интерфейсом.
  • Настройка прослушивателей для захвата . Подключите прослушиватели к элементам управления интерфейса, чтобы начать захват изображения или видео в ответ на действия пользователя, например нажатие кнопки.
  • Захват и сохранение файлов — настройка кода для захвата изображений или видео и сохранения результатов.
  • Освобождение камеры . После использования камеры ваше приложение должно должным образом освободить ее для использования другими приложениями.

Аппаратное обеспечение камеры — это общий ресурс, которым необходимо управлять с умом, чтобы ваше приложение не конфликтовало с другими приложениями, которым оно также может понадобиться. В следующих разделах рассматривается, как обнаружить аппаратное обеспечение камеры, как запросить доступ к ней, как делать снимки или видеосъемку, а также как освободить камеру после завершения её использования приложением.

Внимание: Не забудьте освободить объект