Я хочу написать действие, которое:
- Показывает предварительный просмотр камеры (видоискатель) и имеет кнопку захвата.
- Когда нажата кнопка "захват", выполняется съемка и возвращается к вызывающей активности (setResult() и finish()).
Есть ли полный пример, который работает на каждом устройстве? Идеальным ответом будет ссылка на простое приложение с открытым исходным кодом, которое делает снимки.
Мои исследования:
Это распространенный сценарий, и на нем есть много вопросов и руководств.
Существуют два основных подхода:
- Используйте событие android.provider.MediaStore.ACTION_IMAGE_CAPTURE. См. этот вопрос
- Используйте API-интерфейс камеры напрямую. См. этот пример или этот вопрос (с большим количеством ссылок).
Подход 1 был бы идеальным, но проблема в том, что намерение реализовано по-разному на каждом устройстве. На некоторых устройствах он работает хорошо. Однако на некоторых устройствах вы можете сделать снимок, но он никогда не возвращается в ваше приложение. На некоторых устройствах ничего не происходит, когда вы запускаете намерение. Обычно он также сохраняет изображение на SD-карте и требует наличия SD-карты. Пользовательское взаимодействие также отличается на каждом устройстве.
С подходом 2 проблемы - это стабильность. Я попробовал несколько примеров, но мне удалось остановить работу камеры (до перезапуска) на некоторых устройствах и полностью заморозить другое устройство. На другом устройстве захват работал, но предварительный просмотр остался черным.
Я бы использовал ZXing в качестве примера приложения (я много работаю с ним), но он использует только предварительный просмотр (видоискатель) и не делает никаких снимков. Я также обнаружил, что на некоторых устройствах ZXing автоматически не корректировал баланс белого при изменении условий освещения, в то время как приложение для родной камеры делало это правильно (не уверен, что это можно исправить).
Update:
Некоторое время я напрямую использовал API-интерфейс камеры. Это дает больше контроля (пользовательский интерфейс и т.д.), Но я бы никому не рекомендовал. Я бы работал на 90% устройств, но время от времени новое устройство было выпущено с другой проблемой.
Некоторые из проблем, с которыми я столкнулся:
- Работа с автофокусом
- Работа со вспышкой
- Вспомогательные устройства с фронтальной камерой, задней камерой или обоими
- Каждое устройство имеет разную комбинацию разрешения экрана, разрешения предварительного просмотра (не всегда соответствует разрешению экрана) и разрешения изображения.
Итак, в общем, я бы не стал рекомендовать этот маршрут вообще, если нет другого пути. Через два года я сбросил пользовательский код и переключился на подход, основанный на Intent. С тех пор у меня было гораздо меньше проблем. Проблемы, которые у меня были с подходом, основанным на намерениях, в прошлом были, вероятно, только моей собственной некомпетентностью.
Если вам действительно нужно пройти этот маршрут, я слышал об этом гораздо проще, если вы поддерживаете только устройства с Android 4.0 +.