Как настроить камеру андроид студио

У нас есть фотик и котик — работаем с камерой

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

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

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

Программное включение приложения Камера

Раньше на старых телефонах можно было программно запустить из своей программы системное приложение «Камера» (в этом случае вам не понадобятся дополнительные разрешения) через намерение.

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

А вообще у пользователя могут стоять разные приложения, способные фотографировать. Тогда у вас будет появляться диалоговое окно с выбором нужного приложения. Они все имеют в своём составе такую запись в манифесте (для общего развития):

У Гугла есть своя программа Google Камера. Запустим её, зная имя пакета.

При вызове метода getIntent() вместо new Intent() приложение запускалось сразу, иначе — выводилось диалоговое окно выбора программы из списка. Также нужно быть уверенным, что программа установлена, в примере нет кода проверки.

Делаем фотографии и сохраняем результат. Простой пример

Просто включить камеру не слишком интересно. Рассмотрим практичный пример, когда мы программно запустим приложение «Камера», а полученную фотографию сохраним в папке. Сначала сделаем простой вариант, а потом напишем более сложное приложение.

Используйте статическую константу MediaStore.ACTION_IMAGE_CAPTURE для создания намерения, которое потом нужно передать методу startActivityForResult(). Разместите на форме кнопку и ImageView, в который будем помещать полученный снимок. Этот код запускает стандартное приложение камеры. Полученное с камеры изображение можно обработать в методе onActivityResult():

Не включайте в манифест разрешение на работу с камерой, иначе получите крах приложения.

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

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

По умолчанию фотография возвращается в виде объекта Bitmap, содержащего миниатюру. Этот объект находится в параметре data, передаваемом в метод onActivityResult(). Чтобы получить миниатюру в виде объекта Bitmap, нужно вызвать метод getParcelableExtra() из намерения, передав ему строковое значение data. В примере использовался упрощённый вариант.

Миниатюра и полноразмерное изображение

Если вы укажете исходящий путь URI с помощью параметра MediaStore.EXTRA_OUTPUT в запущенном намерении, полноразмерное изображение, снятое камерой, сохранится в заданном месте. В таком случае в метод onActivityResult() не будет передана миниатюра, а итоговое намерение продемонстрирует значение null.

В следующем примере показано, как при создании снимка получать миниатюру или полноценное изображение, используя намерение. Изображение будет сохранено во внешнем хранилище под именем test.jpg.

Пример работает на устройствах до Android 6.0, потом появились различные системные ограничения и нужно писать дополнительный код.

Добавим разрешение на запись файла в хранилище.

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

Читайте также:  Как настроить пеллетный котел куппер

Запуск камеры в нужном режиме

Мы можем выбрать намерение, позволяющее включить камеру в нужном режиме: фотосъёмка или видео.

Снимаем и кадрируем

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

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

Для большей красоты сделаем задний фон у ImageView с закруглёнными углами и обводкой. Для этого в атрибуте android:background мы прописали специальный стиль. Создайте папку res/drawable, а в ней файл background.xml следующего содержания:

Этот шаг не является обязательным и его можно пропустить.

При нажатии кнопки запускаем приложение Камера и ожидаем результата.

После того, как пользователь сделал нужный кадр, программа Камера возвращает результат обратно в наше приложение. Результат обрабатывается в методе onActivityResult():

Получив полноразмерное изображение, мы пытаемся откадрировать его. Для этого создадим метод performCrop(), который запускает специальное намерение, предназначенное для этих целей. В успешном случае результат снова возвращается в наше приложение, но уже с другим кодом PIC_CROP. Теперь мы имеем нужное изображение, которое можно вывести на экран.

При кадрировании мы указываем желаемые размеры (код метода ниже). Если указать слишком больше размеры (больше 400), то результат не возвращается. Попробуйте добавить ещё два параметра:

Результат работы приложения, когда запускается намерение кадрирования и итоговый результат. Желательно тренироваться на кошках.

Источник

Как настроить камеру андроид студио

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

Существует масса приложений в которых происходит работа с камерой устройства и в этом уроке мы тоже научимся использовать камеру устройства в своих приложениях.

Создаем новый проект, берем Blank Activity. Сразу давайте импортируем в проект нужные строки:

Они позволят нам делать захват изображения, его сохранение и высвечивать на экран пользователя.

Теперь давайте добавим строковые ресурсы, которые будут использоваться в приложении. Открываем файл strings.xml и добавляем туда строки:

Перейдем к работе над интерфейсом программы. Открываем файл activity_main.xml. Нам нужно создать 3 элемента: TextView, кнопку для запуска камеры Button и элемент для отображения фото ImageView:

Для ImageView установлен фон @drawable/border и эта строка сейчас подсвечивается красным, потому, что такого файла border у нас пока нету. Его нужно создать. Этот файл будет задавать вид для ImageView. Для того, чтобы он корректно отображался во всех возможных случаях, этот файл нужно создать для каждой папки drawable (то есть, drawable, drawable-hdpi, drawable-mdpi, drawable-xhdpi, drawable-xxhdpi). Сделаем так, создаем файл border.xml в папке drawable. Он будет содержать следующее:

Получился вот такой вот вид:

Берем этот код, копируем в блокнот, создаем в каждой из drawable папок, указанных выше, файл border.xml и кидаем в них этот же код (ищем эти папки вручную в файлах приложения и вручную создаем файлики).

На данный момент интерфейс нашей программы выглядит так:

Добавим нашей кнопке в activitymain.xml нажатие:

И добавим метод описания этого нажатия. Ставим курсор на «Photo», жмем Atl+Enter и выбираем верхнюю строку:

Переходим к работе в файле MainActivity.java. В методе onCreate заявляем о существовании нашей кнопки:

Теперь переходим к самому интересному — настроим запуск камеры по нажатию на кнопку»Запустить камеру». До метода onCreate задаем использование следующих переменных:

В методе Photo (обработки нажатия) добавляем намерение использовать камеру и работать с полученными с нее данными:

Когда будет выполняться эта часть кода, будет запускаться камера и пользователь может сделать фото. Но нужно также предупредить ситуацию, когда устройство пользователя не может выполнять это действие, сделаем это с помощью всплывающего сообщения Toast (вспоминаем урок:)). Для этого добавляем в методе Photo следующее:

Читайте также:  Камин с парогенератором не работает

Следующим шагом нужно научить программу извлекать полученное камерой изображение. Ниже метода «Photo» добавляем метод onActivityResult (ставим курсор на пространство ниже метода «Photo», жмем на панели программы Code — Override Methods, начинаем вводить имя метода, подсказки вам его укажут). Добавляем в него следующее:

Сейчас строка cropImage(); подсвечена красным, ставим на нее курсор и Android Studio предлагаем нам создать метод cropImage, соглашаемся:

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

Дальше добавляем код, который будет указывать приложению извлекать изображение после его захвата (извлечение данных с камеры в приложение) , задавать захваченному камерой изображению различные характеристики:

Ну и под конец, нужно настроить отображение полученного с камеры изображения. В методе ‘onActivityResult’ после оператора if добавим оператор else, в котором опишем действия для программы по возвращению от действий захвата изображения:

И добавляем в этот оператор следующий код:

Чтобы вы не потеряли ничего с необходимого кода, вот весь код файла MainActivity.java:

Все готово! Приступаем к тестированию приложения. Как вы поняли, тест на эмуляторе ничего не даст, нужно устройство с реальной камерой.

Источник

Полный список

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

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

Для работы с настройками используется объект Camera.Parameters. Он содержит кучу методов, которые можно разделить на несколько групп.

Методы is Supported позволяют узнать поддерживается ли данная опция/настройка камерой.

Методы get Supported и getMax предоставят вам набор поддерживаемых значений или максимальное значение опции/настройки.

Методы get вернут текущее значение настройки.

Методы set установят текущее значение настройки.

В этом уроке рассмотрим на практике работу с парой настроек: цветовые эффекты и режимы вспышки. А также я опишу работу с настройками, которые выбиваются из общего алгоритма.

Напомню, что в Уроке 132 мы разбирались с тем, как совместить размеры экрана и превью камеры, и учесть поворот устройства. А в Уроке 133 – как сохранить фото или видео. В этом уроке я не буду это использовать, чтобы не повторяться и не усложнять материал.

Project name: P1341_CameraFeatures
Build Target: Android 2.3.3
Application name: CameraFeatures
Package name: ru.startandroid.develop.p1341camerafeatures
Create Activity: MainActivity

В strings.xml добавим строки:

На экране у нас SurfaceView для вывода изображения и два спиннера настроек. Первый будет предоставлять выбор цветовых эффектов, а второй – режимы работы вспышки. Про спиннеры я рассказывал в Уроке 56.

В манифесте добавляем права на работу с камерой

В onCreate мы, как обычно, определяем SurfaceView, холдер и callback для холдера.

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

В onPause освобождаем ресурсы.

В initSpinners мы поочередно настраиваем спиннеры. Сначала тот, который для выбора цветовых эффектов.

Используем метод getParameters, чтобы получить текущие настройки камеры. И метод getSupportedColorEffects, чтобы из этих настроек получить цветовые эффекты, которые поддерживаются этим устройством. Результат приходит в виде списка строк.

Далее вызываем свой метод initSpinner (чуть ниже обсудим и его), который заполнит спиннер. На вход ему передаем:
— id спиннера
— набор значений, которые он будет отображать
— текущее значение настройки цветовых эффектов, которые мы получаем из настроек методом getColorEffect

Методом setOnItemSelectedListener ставим обработчик выбора значения из спиннера. При выборе мы получаем настройки, устанавливаем выбранный цветовой эффект методом setColorEffect и присваиваем эти настройки камере методом setParameters. После этого камера подхватит новые настройки и мы увидим в превью результат.

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

Метод initSpinner находит спиннер, создает для него адаптер с полученными данными и устанавливает текущее значение спиннера соответственно текущей настройке камеры.

Читатель на форуме абсолютно верно заметил, что имеет смысл в код добавить проверку на null для списков, которые мы получаем от методов getSupportedColorEffects и getSupportedFlashModes. Т.к. камера может вообще не поддерживать эти настройки.

Читайте также:  Настроить датчик приближения инженерное меню

Все сохраняем и запускаем приложение.

Видим такой экран

Попробуем применить цветовой эффект. Жмем спиннер Color Effect и видим варианты.

У вас, скорее всего, будут другие, это от камеры девайса зависит.

Я выберу negative и получаю такую картинку

Снова выберу цветовой эффект none.

Теперь проверим режимы вспышки. Жмем Flash Mode.

аuto – камера сама решит, использовать ей вспышку или нет
on – вспышка будет использована при снимке
off — вспышка не будет использована при снимке
torch – режим фонарика

Я выберу torch и вспышка начинает гореть, это видно в отражении монитора.

Почти все остальные настройки меняются по такому же алгоритму. Я не буду все их рассматривать. Если будут какие-либо вопросы по ним, давайте обсуждать на форуме.

Есть пара особенных настроек, с другим алгоритмом. О них поговорим. Примеры тут у меня не получится сделать, поэтому без них. Буду использовать код и картинки из хелпа.

Замер света и фокус

Для хорошей съемки камере надо:
— знать на чем фокусироваться, чтобы не получить размытую картинку
— определить уровень освещенности, чтобы не получить пересвеченную или затемненную картинку.

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

Здесь мы получаем камеру и ее параметры. Методом getMaxNumMeteringAreas определяем, кол-во областей, которое сможет учитывать камера. Если значение = 0, то эта функция не поддерживается.

Затем создаем список и помещаем в него пару областей. Область представляет из себя Rect-объект. Он должен лежать в пределах от -1000,-1000 до 1000,1000. Т.е. превью камеры представлено как система координат, у которой центр (0,0) находится в центре экрана и обе оси по обоим направлениям имеют длину 1000. И в этой системе мы задаем Rect.

Картинка из хелпа

На рисунке показано где будет расположен Rect с значениями 333,333,666,666.

Созданный Rect оборачивается в объект Camera.Area. При этом указывается вес, от 1 до 1000. Чем больше вес области, тем больше значения будет придаваться полученным из нее данным по замеру света.

Полученный список с двумя областями передаем параметрам камеры с помощью метода )» target=»_blank» rel=»noopener noreferrer»>setMeteringAreas. И в конце отдаем параметры камере.

С областями для фокуса аналогично. Метод getMaxNumFocusAreas дает нам кол-во поддерживаемых областей фокуса. Создаем список областей, указывая координаты и вес, и отдаем список методу )» target=»_blank» rel=»noopener noreferrer»>setFocusAreas.

Распознавание лиц

Для использования этой опции нам необходимо в приложении выполнить следующие действия:

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

Примеры кода из хелпа:

Это создание класса-слушателя, который реализует интерфейс Camera.FaceDetectionListener. В методе onFaceDetection будет получать сведения о распознанных лицах (Face) и выводит в лог координаты первого лица (атрибут rect). Правда, судя по хелпу, координаты эти будут не экранными, а из знакомой нам уже системы (-1000,-1000) – (1000,1000). Но тот же хелп любезно дает код для настройки матрицы преобразования с учетом расположения и поворота камеры.

Также Face имеет атрибуты:

id – идентификатор лица
leftEye – координаты центра левого глаза, может быть null
rightEye — координаты центра правого глаза, может быть null
mouth — координаты центра рта, может быть null
score – уверенность системы в том, что это реальное лицо. Варьируется от 0, до 100. Рекомендуется отфильтровывать лица, с score

Присоединяйтесь к нам в Telegram:

— в канале StartAndroid публикуются ссылки на новые статьи с сайта startandroid.ru и интересные материалы с хабра, medium.com и т.п.

— в чатах решаем возникающие вопросы и проблемы по различным темам: Android, Kotlin, RxJava, Dagger, Тестирование

— ну и если просто хочется поговорить с коллегами по разработке, то есть чат Флудильня

— новый чат Performance для обсуждения проблем производительности и для ваших пожеланий по содержанию курса по этой теме

Источник

Оцените статью