Android у нас є фотік і котик - працюємо з камерою

Android у нас є фотік і котик - працюємо з камерою

Програмне активувати програму Камера

Ви можете програмно запустити зі своєї програми системне додаток "Камера" (в цьому випадку вам не знадобляться додаткові дозволи) через намір.

А взагалі у користувача можуть стояти різні додатки, здатні фотографувати. Тоді у вас буде з'являтися діалогове вікно з вибором потрібного додатка. Вони всі мають в своєму складі таку запис в маніфесті (для загального розвитку):

У Гугла є своя програма Google Камера. Запустимо її.

При виклику методу getIntent () замість new Intent () додаток запускалося відразу, інакше - виводилося діалогове вікно вибору програми зі списку. Також потрібно бути впевненим, що програма встановлена, в прикладі немає коду перевірки.

Робимо фотографії та зберігаємо результат. простий приклад

Просто включити камеру не дуже цікаво. Розглянемо практичний приклад, коли ми програмно запустимо додаток "Камера", а отриману фотографію збережемо в папці. Для початку сфокусуємось на основному завданню, а потім напишемо більш складний додаток.

Використовуйте статичну константу ACTION_IMAGE_CAPTURE з об'єкта MediaStore для створення наміри, яке потім потрібно передати методу startActivityForResult (). Додайте на формі кнопку і ImageView. в який будемо поміщати отриманий знімок. Цей код запускає стандартний додаток камери. Отримане з камери зображення можна обробити в методі onActivityResult ():

Даний код запустить активність для управління камерою, дозволяючи користувачеві поміняти настройки зображення, що звільняє вас від необхідності створювати своє власне додаток для цих потреб.

За замовчуванням фотографія повертається у вигляді об'єкта Bitmap. містить мініатюру. Цей об'єкт знаходиться в параметрі data. переданому в метод onActivityResult (). Щоб отримати мініатюру у вигляді об'єкта Bitmap. потрібно викликати метод getParcelableExtra () з наміри, передавши йому строкове значення data.

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

У наступному прикладі показано, як при створенні знімка отримувати мініатюру або повноцінне зображення, використовуючи намір.

В Android 6.0 Marshmallow приклад перестав працювати через нові правил з дозволами. Новий варіант представлений у відповідній статті.

Зрозумівши основи, можна ускладнити приклад.

Припустимо, ви створили спеціальну службу, яка відстежує бездомних котів і співробітники вашої організації привозять їм подарунки, а також гладять їх. Користувачі, які завантажили ваш додаток, повинні сфотографувати кота, а потім інформація про місце зйомки та інші параметри потрапляють до вас в центр для обробки. Фотографування котів - це частина вашої програми. Не обов'язково придумувати велосипед і працювати безпосередньо з функціями камери. У вас вже є системне додаток Камера, за допомогою якого можна швидко зробити фотографію і отримати результат назад в додаток.

Спочатку зробимо невеликі приготування. Є клас пристроїв, у яких немає камер, наприклад, електронні рідери. Щоб користувачі цих пристроїв не скачували даремно ваше додаток, яке виявиться для них непотрібним, пропишемо в маніфесті вимога наявності камери.

Оформимо окрему функцію для запуску наміри.

Цей код запускає стандартний додаток камери. Отримане з камери зображення можна обробити в методі onActivityResult ().

Про всяк випадок напишемо функцію для перевірки можливості додатком обробляти Ваші наміри:

Ця функція допоможе нам під час завантаження програми перевірити наявність відповідного наміри. Якщо відповідного додатка не знайдеться, то ми можемо зробити кнопку для зйомки недоступною.

Системне додаток Камера кодує фото в повернутому намір, яке надходить в метод onActivityResult () у вигляді невеликого Bitmap в ключі data. Наступний код отримує зображення і виводить його в ImageView.

Щоб програма Камера зберігало повнорозмірні фотографії, нам потрібно повідомити йому ім'я файлу для збереження і його повний шлях.

В Android 2.2 і вище (API 8) є спеціальний метод, щоб отримати стандартний шлях для фотографій:

Для більш ранніх версій Android, ви повинні ввести ім'я директорії фото самостійно:

Властивість PICTURES_DIR - це просто папка Pictures / - стандартне розташування для загальних фотографії на зовнішньому / спільному сховищі.

Необхідно подбати про унікальність імені файлу, щоб уникнути конфліктів:

У нашому прикладі ім'я файлу формується з дати, що дозволяє не боятися створення дублікатів.

Якщо у нас є місце для збереження зображення, то повідомте шлях з додатком камери через намір:

Додаємо фото в додаток Галерея

При створенні фото через намір ви повинні знати, де буде розташовано ваше зображення, тому що вам потрібно вказати, куди його зберігати. Можна піти іншим шляхом - зробити фотографію доступною для системи за допомогою Media Provider.

Наступний приклад демонструє метод виклику системного медіа-сканера, щоб додати вашу фотографію в базу даних Media Provider, що зробить її видимої в Галерея та інших додатках.

Декодування збільшувати або зменшувати зображення

Знімаємо і кадріруем

Розглянемо ще один приклад, коли ми запустимо додаток Камера, а також включимо режим кадрування. Зверніть увагу, що основна частина коду залишається колишньою. Я спеціально даю різні приклади з незначними змінами, щоб ви могли вибрати відповідні прийоми для вашого завдання. Також рекомендую перевіряти роботу з камерою на реальних пристроях, так як багато виробників замінюють стандартні методи зйомки своїми прошивками і драйверами. Зокрема, намір з кадруванням є проблемною, і в інтернеті багато хто скаржиться на відсутність підтримки цього способу.

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

Для більшої краси зробимо задній фон у ImageView із закругленими кутами і обведенням. Для цього в атрибуті android: background ми прописали спеціальний стиль. Створіть папку res / drawable. а в ній файл background.xml такого змісту:

Цей крок не є обов'язковим і його можна пропустити.

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

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

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

Під час кадрування ми вказуємо бажані розміри (код методу нижче). Якщо вказати занадто більші розміри (більше 400), то результат не повертається. Спробуйте додати ще два параметри:

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

Android у нас є фотік і котик - працюємо з камерою

Android у нас є фотік і котик - працюємо з камерою

Показати код (клацніть мишкою)

додаткове читання