Работа с камерой в Android. Часть 1. Делаем снимки.

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

Делаем фотографии.

Первым делом создадим базовую активность, которая будет содержать компонент ImageView для отображения снимка и кнопку Камера, при нажатии на которую мы сможем создать снимок. Вы вольны в своем приложении использовать любой дизайн и расположение кнопок. Сейчас это не так важно. У меня получилось следующее:

android_camera

Файл activity_main.xml:

Файл content_main.xml:

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

Теперь нам нужно сделать снимок и результат отобразить в виджете ImageView. Для начала напишем стандартный код активности и установки пользовательского интерфейса.

Теперь как нам запустить камеру? Программно это можно сделать следующим образом:

1). Создать намерение (Intent), передав ему в качестве параметра статическую переменную MediaStore.ACTION_IMAGE_CAPTURE.

2). Вызвать метод startActivityForResult(intent, CAMERA_REQUEST_CODE).

3). Переопределить метод onActivityResult(), в котором мы собственно и получим наш результат (снимок).

Теперь взглянем на код, который следует добавить в обработчик нашей кнопки:

Константу CAMERA_REQUEST_CODE следует определить заранее. Она задает ваш собственный код запроса, который вы посылаете активности. Запросы могут посылаться разным активностям и сами запросы могут быть разными. В методе onActivityResult() при получении какого-то из результатов вы также получите код запроса, по которому сможете различить, результат какого именно запроса вы получили.

Ниже приведен код переопределенного метода onActivityResult() с обработкой результата нашего запроса.

Метод обратного вызова onActivityResult() получает три параметра — код запроса, код результата(успех или неудача) и объект Intent, хранящий данные ответа. В этом методе мы сначала проверяем requestCode. Если он совпадает с заданными нами кодом запроса, то далее выполняется проверка на успешность выполнения нашего запроса. Если все ок, и данные не пусты, то мы получаем наше изображение и выводим его в ImageView.

После запуска на эмуляторе можно получить примерно следующее:

android_camera_1

Android 6.0 и runtime permissions.

Если вы пробовали запускать данный пример на версии Android 6.0 или выше, то при запуске камеры наверня-ка получили сообщение об ошибке. Перед началом работы с версиями Android 6.0 и выше следует ознакомиться с механизмом так называемых runtime permissions. Вкратце — это механизм получения прав на те или иные функции тогда, когда их использование необходимо. Перед использованием камеры вы должны спросить пользователя: разрешает ли он дать вашему приложению доступ к камере. Если нет — то показать ему соответствующее сообщение.

Так, немного перепишем пример, чтобы он запускался на Android M. Добавляем метод, который будет запрашивать у пользователя разрешение на использование камеры:

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

Теперь нам нужно переопределить метод onRequestPermissionsResult():

Основной параметр, который нас здесь интересует — это массив grantResults. Он содержит результаты запросов соответствующих разрешений. Каждый i-ый элемент из массива grantResults соответствует i-ому элементу из массива permissions. В нашем примере мы запрашивали всего одно разрешение и результат хранится в самой первой ячейке массива grantResults.

Если доступ разрешен, то мы точно также запускаем камеру, а если — нет, то выводим пользователю сообщение об ошибке.

Теперь при нажатии на кнопку на экране появится всплывающий диалог с описанием запрашиваемого permission’а:

android_camera_2

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

Ваш e-mail не будет опубликован. Обязательные поля помечены *