Пример камеры на Android

Я хочу написать действие, которое:

  1. Показывает предварительный просмотр камеры (видоискатель) и имеет «захват» "кнопка.
  2. При нажатии кнопки" захват "делает снимок и возвращает его вызывающему действию (setResult () & finish ()).

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


Мои исследования на данный момент:

Это распространенный сценарий, и есть много вопросов и руководств по этому поводу.

Существует два основных подхода:

  1. Используйте событие android.provider.MediaStore.ACTION_IMAGE_CAPTURE. См. этот вопрос
  2. Используйте API камеры напрямую. См. это например или этот вопрос (с большим количеством ссылок) .

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

При подходе 2 проблема заключается в стабильности. Я пробовал несколько примеров, но мне удалось остановить работу камеры (до перезапуска) на некоторых устройствах и полностью заморозить другое устройство. На другом устройстве захват работал, но превью оставалось черным.

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


Обновление:

Некоторое время я напрямую использовал API камеры. Это дает больше контроля (пользовательский интерфейс и т. Д.), Но я бы никому не рекомендовал это. Я бы работал на 90% устройств, но то и дело выпускалось новое устройство с другой проблемой.

Некоторые из проблем, с которыми я столкнулся:

  • Обработка автофокуса
  • Обработка вспышки
  • Поддержка устройств с передней камерой, задней камерой или и тем, и другим
  • Каждое устройство имеет разную комбинацию разрешения экрана, предварительного просмотра разрешения (не всегда соответствуют разрешению экрана) и разрешения изображения.

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

Если вам действительно нужно идти этим путем, я слышал, что это намного проще, если вы поддерживаете только устройства с Android 4.0+.

19
задан Community 23 May 2017 в 12:34
поделиться