Управление камерой

В уроке мы обсудим, как напрямую управлять камерой, используя API.

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

Создаем объект камеры

Первым делом нужно получить экземпляр класса Camera. Рекомендуем работать с камерой в отдельном потоке (его можно создать в методе onCreate()) , как это делает стандартное приложение Камера. Это хорошая идея, поскольку запуск камеры может утянуть на дно весь поток с пользовательским интерфейсом. В отдельных случаях можно запускать камеру в методе onResume(), чтобы упростить повторное использование кода и сделать управление проще.

Вызов метода Camera.open() вызовет исключение, если камера используется другим приложением. Используйте блок try для обработки таких ситуаций:

Начиная с версии API 9, фреймворк поддерживает работу с несколькими камерами. Если вы используете старый API и вызываете open() без аргументов, вы получите заднюю камеру.

Создание предпросмотра с камеры

Чтобы сделать фотографию, требуется также, чтобы пользователь видел, что он снимает, прежде чем нажмет на спусковой крючок. Вы можете использовать класс SurfaceView, чтобы организовать предпросмотр с сенсора камеры.

Создаем класс предпросмотра

Чтобы запустить предпросмотр, сначала надо создать класс для предпросмотра. Предпросмотр требует реализации интерфейса android.view.SurfaceHolder.Callback, который используется для передачи картинки с датчика камеры в приложение:

Класс предпросмотра должен быть передан объекту Camera прежде, чем предпросмотр будет запущен.

Выбор и запуск предпросмотра

Экземпляр камеры и связанный с ним экземпляр предпросмотра должны создаваться в определенном порядке – объект камеры должен создаваться первым. В приведенном ниже примере, процесс инициализации камеры сделан таким образом, что метод Camera.startPreview() вызывается в методе setCamera() всякий раз, когда пользователь меняет камеру. Объект предпросмотра должен также перезапускаться в методе обратного вызова surfaceChanged() класса предпросмотра.

Меняем настройки камеры

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

Выбираем ориентацию предпросмотра

Большинство приложений блокируют ориентацию дисплея в альбомном режиме, поскольку это естественная ориентация сенсора камеры. Этот параметр не мешает вам делать снимки в портретном режиме, поскольку ориентация сенсора записывается в заголовки EXIF. Метод setCameraDisplayOrientation() позволяет изменить ориентацию предпросмотра, не затрагивая информацию, которая будет записана. Однако, в Android до версии API 14, вы должны остановить предпросмотр, прежде чем изменить его ориентацию, а затем запустить заново.

Получение картинки с камеры

Используйте метод Camera.takePicture(), чтобы получить изображение с камеры, после того, как предпросмотр был запущен. Вы можете создать объекты Camera.PictureCallback и Camera.ShutterCallback и передать их в метод Camera.takePicture().

Если вы хотите захватывать изображения непрерывно, вы можете создать объект Camera.PreviewCallback, который содержит метод onPreviewFrame(). Вы можете захватить кадры только из выбранного объекта предпросмотра, или настроить задержку для вызова takePicture().

Перезапуск предпросмотра

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

Остановка предпросмотра и освобождение камеры

Вы должны освободить объект Camera, как только камера становится не нужна. Иначе вы рискуете получить аварийное завершение других приложений, или даже новых экземпляров вашего приложения.

Когда же следует освободить камеру? Пожалуй, уничтожение окна предпросмотра, это хороший намек, что пора бы остановить просмотр и освободить камеру. Пример:

Ранее в этом уроке, эта процедура была также частью метода setCamera(), поскольку инициализация камеры всегда начинается с остановки предварительного просмотра.

Добавить комментарий