- У нас есть фотик и котик — работаем с камерой
- Программное включение приложения Камера
- Делаем фотографии и сохраняем результат. Простой пример
- Миниатюра и полноразмерное изображение
- Запуск камеры в нужном режиме
- Снимаем и кадрируем
- iVARIOUS
- Developer от Бога
- четверг, 6 июля 2017 г.
- Android. Камера. Android.hardware.camera2
- Что такое android hardware camera provider
- Что такое android hardware camera provider
- iVARIOUS
- Что такое Camera2 API, зачем это нужно и как узнать, поддерживает ли её ваш смартфон
- Что такое Camera2 API
- Как узнать, есть ли поддержка Camera2 API
У нас есть фотик и котик — работаем с камерой
Практически все современные телефоны и планшеты снабжаются камерами, что позволяет фотографировать любимых котиков.
Сначала сделаем небольшие приготовления. Есть класс устройств, у которых нет камер, например, электронные ридеры. Чтобы пользователи этих устройств не скачивали зря ваше приложение, которое окажется для них бесполезным, пропишем в манифесте требование наличия камеры.
Если камера в вашем приложении выполняет вспомогательную функцию, а приложение может работать и без неё, то установите значение 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), то результат не возвращается. Попробуйте добавить ещё два параметра:
Результат работы приложения, когда запускается намерение кадрирования и итоговый результат. Желательно тренироваться на кошках.
Источник
iVARIOUS
Блог незаурядного человека
Developer от Бога
четверг, 6 июля 2017 г.
Android. Камера. Android.hardware.camera2
С появлением Android API >21 интерфейс работы с камерой принципиально изменился. В основном причина — совершенствование техники и аппаратного обеспечения которое позволяет дать разработчикам гораздо больше возможностей. Первое что нужно понять — принцип работы функций обратного вызова, которые вызываются не программой, а самой Операционной Системой Android после наступления некоторого события (например — камера готова к использованию или кадр готов к чтению). Все остальное можно понять с краткого описания в документации и примера приложения которое просто открывает камеру, без перегрузки кода пока лишними элементами типа — кнопок, сохранения кадров и т.п. Для начала нужно разобрать минимум действий для запуска камеры.
Пакет Android.hardware.camera2 предоставляет интерфейс для разных устройств-камер, подключенных к Android. Он заменяет устаревший класс Camera. Классы этого пакета создают потоковый интерфейс, который принимает входные данные запросов для захвата одного кадра, захвата одного изображения с каждого запроса, а затем выводит этот результат, плюс — набор буферов вывода изображений. Запросы обрабатываются таким образом, что несколько запросов может находиться в процессе сразу. Поскольку устройство камеры представляет собой поток из нескольких этапов, имея несколько запросов в одновременно требуется поддерживать полный фреймрейт на большинстве устройств Android.
Ниже перечислены некоторые классы Сamera2:
Типы нужных запросов, а также доступные на устройстве камеры определены в классе CameraManager
CameraDevices предоставляет набор статической информации описывающий аппаратное устройство, доступные параметры и параметры вывода для данного устройства. Эта информация предоставляется через объект CameraCharacteristics, и доступна через getCameraCharacteristics(String).
Для того, чтобы захватить кадр или поток изображений с камеры, приложение должно сначала создать сеанс захвата с набором выходных Surfaces для использования вместе с устройством камеры, с createCaptureSession (List, CameraCaptureSession.StateCallback, Handler). Каждый Surfaces должен быть предварительно сконфигурирован с соответствующим размером и форматом (если это применимо), чтобы соответствовать размерам и форматам, доступные для данной модели камеры. Целевой Surfaces может быть получен из различных классов: SurfaceView, SurfaceTexture через Surface(SurfaceTexture), MediaCodec, MediaRecorder, Allocation и ImageReader.
Как правило, предварительный просмотр изображений отправляется на SurfaceView или TextureView (через его SurfaceTexture). Захват изображений JPEG или RAW буфера для DngCreator может быть произведен ImageReader с форматами JPEG и RAW_SENSOR. Применение управляемой обработки данных камеры в Renderscript, OpenGL ES, или непосредственно в управляемом машинном коде лучше всего делать с типом YUV, SurfaceTexture и ImageReader с форматом YUV_420_888, соответственно.
После этого приложение должно создать CaptureRequest , который определяет все необходимые параметры для захвата одного изображения. Запрос также перечисляет, какие из сконфигурированных выходных Surfaces следует использовать для этого захвата. CameraDevice имеет собственный метод для создания запроса постройщика (builder) для данного варианта использования, который оптимизирован для работы приложения в Android устройстве.
Источник
Что такое android hardware camera provider
Что такое android hardware camera provider
В теме нет куратора. Если в теме есть пользователь, желающий стать Куратором и соответствующий Требованиям для кандидатов, он может подать заявку в теме Хочу стать Куратором (предварительно изучив шапку темы и все материалы для кураторов).
До назначения куратора, по вопросам наполнения шапки, обращайтесь к модераторам раздела через кнопку под сообщениями, на которые необходимо добавить ссылки.
Сообщение отредактировал sad1968 — 06.03.21, 08:07
Xiaomi Redmi Note 5 оснащен достаточно емкой батареей на 4000 мАч и энергоэффективным процессор, а значит следует ожидать высокой автономности.
iVARIOUS
С появлением Android API >21 интерфейс работы с камерой принципиально изменился. В основном причина — совершенствование техники и аппаратного обеспечения которое позволяет дать разработчикам гораздо больше возможностей. Первое что нужно понять — принцип работы функций обратного вызова, которые вызываются не программой, а самой Операционной Системой Android после наступления некоторого события (например — камера готова к использованию или кадр готов к чтению). Все остальное можно понять с краткого описания в документации и примера приложения которое просто открывает камеру, без перегрузки кода пока лишними элементами типа — кнопок, сохранения кадров и т.п. Для начала нужно разобрать минимум действий для запуска камеры.
Пакет Android.hardware.camera2 предоставляет интерфейс для разных устройств-камер, подключенных к Android. Он заменяет устаревший класс Camera. Классы этого пакета создают потоковый интерфейс, который принимает входные данные запросов для захвата одного кадра, захвата одного изображения с каждого запроса, а затем выводит этот результат, плюс — набор буферов вывода изображений. Запросы обрабатываются таким образом, что несколько запросов может находиться в процессе сразу. Поскольку устройство камеры представляет собой поток из нескольких этапов, имея несколько запросов в одновременно требуется поддерживать полный фреймрейт на большинстве устройств Android.
Ниже перечислены некоторые классы Сamera2:
Типы нужных запросов, а также доступные на устройстве камеры определены в классе CameraManager
CameraDevices предоставляет набор статической информации описывающий аппаратное устройство, доступные параметры и параметры вывода для данного устройства. Эта информация предоставляется через объект CameraCharacteristics, и доступна через getCameraCharacteristics(String).
Для того, чтобы захватить кадр или поток изображений с камеры, приложение должно сначала создать сеанс захвата с набором выходных Surfaces для использования вместе с устройством камеры, с createCaptureSession (List, CameraCaptureSession.StateCallback, Handler). Каждый Surfaces должен быть предварительно сконфигурирован с соответствующим размером и форматом (если это применимо), чтобы соответствовать размерам и форматам, доступные для данной модели камеры. Целевой Surfaces может быть получен из различных классов: SurfaceView, SurfaceTexture через Surface(SurfaceTexture), MediaCodec, MediaRecorder, Allocation и ImageReader.
Как правило, предварительный просмотр изображений отправляется на SurfaceView или TextureView (через его SurfaceTexture). Захват изображений JPEG или RAW буфера для DngCreator может быть произведен ImageReader с форматами JPEG и RAW_SENSOR. Применение управляемой обработки данных камеры в Renderscript, OpenGL ES, или непосредственно в управляемом машинном коде лучше всего делать с типом YUV, SurfaceTexture и ImageReader с форматом YUV_420_888, соответственно.
После этого приложение должно создать CaptureRequest , который определяет все необходимые параметры для захвата одного изображения. Запрос также перечисляет, какие из сконфигурированных выходных Surfaces следует использовать для этого захвата. CameraDevice имеет собственный метод для создания запроса постройщика (builder) для данного варианта использования, который оптимизирован для работы приложения в Android устройстве.
Что такое Camera2 API, зачем это нужно и как узнать, поддерживает ли её ваш смартфон
Обилие камер, которыми пестрят современные смартфоны, — это ещё не гарантия хороших фото. Большое значение имеет программное обеспечение, которому зачастую удаётся наделить невероятными возможностями даже проходной и не самый новый модуль. Именно по этой причине стали так популярны порты Google Camera, которая снабжала даже бюджетные смартфоны полноценными ночным и портретным режимами съёмки, а также повышала общее качество снимков, делая их более насыщенными, детализированными и контрастными. Но Google Camera – это только половина успеха. Другая половина – поддержка Camera2 API.
Camera2 API — это своего рода драйвер для камеры смартфона
Думаю, вам не раз приходилось слышать про Camera2 API. Это низкоуровневое ПО, которое является связующим звеном между аппаратным модулем камеры и приложением для фото- или видеосъёмки. Проще говоря, это тот же самый драйвер, который вы устанавливаете на свой Windows-компьютер, чтобы принтер или монитор могли правильно работать.
Что такое Camera2 API
Слева — снимок, сделанный на Gcam, справа — на штатную камеру смартфона. У вас ещё есть вопросы, зачем нужен GCAM?
Но ведь чем-то же Camera2 API уникальна, иначе бы о ней не говорили с таким придыханием. Не так ли? Да, отчасти это действительно так. Camera2 API – это собственная разработка Google, которая открывает приложениям обширный доступ к настройкам камеры вроде ISO, скорости срабатывания затвора, съёмки RAW и т.д. Несмотря на то, что она такая крутая, эта утилита встречается не на всех смартфонах.
Вообще, существует четыре уровня поддержки Camera2 API. Проще всего объяснять их особенности на примере Google Camera, под которую этот драйвер во многом и разрабатывался.
- Legacy – присутствует поддержка только устаревшего драйвера Camera API, который использовался до выхода Android 5.0 Lollipop. Она обеспечивает возможность установки Google Camera, но с минимумом доступных функций, то есть, без портретного режима, без Night Shift и т.д.
- Limited – частичная поддержка Camera2 API, которая позволяет установить Google Camera, но не даёт ей реализовать весь свой потенциал. Функциональность Google Camera при условии ограниченной поддержки может варьироваться от устройства к устройству.
- Full – полная поддержка драйвера без каких-либо оговорок и ограничений с возможность установки полноценной версии Google Camera.
- Level_3 – полная поддержка Camera2 API с рядом продвинутых фишек полупрофессиональной направленности. Как правило, они касаются съёмки в RAW и направлены на глубокую подстройку кадра.
Как узнать, есть ли поддержка Camera2 API
Если вы собираетесь установить себе Google Camera, но не знаете, будет ли она поддерживаться на вашем смартфоне или уже это сделали, но не понимаете, почему те или иные фишки не работают, лучше всего вам проверить совместимость с Camera2 API. А сделать это можно при помощи специального приложения.
- Скачайте приложение Camera2 API Probe из Google Play;
- Дождитесь окончания загрузки и запустите приложение;
- Откройте вкладку Camera2 API на самом верху экрана;
Слева — вид поддержки Camera2 API, справа — ограничения
- Посмотрите на строку Hardware Support Level;
- Поддерживаемый уровень Camera2 API будет окрашен в зелёный;
- Чтобы посмотреть ограничения, пролистайте список доступных параметров вниз и посмотрите на красные — это они и есть.
В моём случае это уровень поддержки Limited. То есть большая часть функций Google Camera на моём смартфоне работать не будут. Однако дело тут не в том, что производитель не захотел адаптировать драйвер Google для моего смартфона, а в его аппаратном обеспечении. Всё дело в том, что смартфоны Huawei и Honor – а у меня как раз такой – оснащаются процессорами Kirin, которые сильно отличаются от Snapdragon. А именно под них Google и разрабатывала свой Camera2 API. В результате установить Google Camera на мой аппарат не получится.
Источник