если android.hardware.Camera
устарело и вы не можете использовать эту переменную Camera
, то какая альтернатива этому?
android
android-camera
android-hardware
раджа121
источник
источник
android.hardware.camera2
Ответы:
Документация по API
Согласно руководству для разработчиков Android
android.hardware.Camera
, они заявляют:На информационной странице о
android.hardware.camera2
(ссылка выше) указано:Эта проблема
Когда вы проверите эту документацию, вы обнаружите, что реализация этих двух API камеры сильно различается.
Например, получение ориентации камеры
android.hardware.camera
Против
android.hardware.camera2
Это затрудняет переключение с одного на другой и написание кода, который может обрабатывать обе реализации.
Обратите внимание, что в этом единственном примере кода мне уже приходилось обходить тот факт, что старый API камеры работает с
int
примитивами для идентификаторов камеры, а новый работает сString
объектами. В этом примере я быстро исправил это, используя int в качестве индекса в новом API. Если камера возвращается не всегда в том же порядке, это уже вызовет проблемы. Альтернативный подход - работать с объектами String и строковым представлением старых int cameraID, что, вероятно, более безопасно.Один далеко
Теперь, чтобы обойти эту огромную разницу, вы можете сначала реализовать интерфейс и ссылаться на него в своем коде.
Здесь я перечислю код для этого интерфейса и 2 его реализации. Вы можете ограничить реализацию тем, что вы фактически используете API камеры, чтобы ограничить объем работы.
В следующем разделе я быстро объясню, как загрузить тот или иной.
Интерфейс, содержащий все, что вам нужно, чтобы ограничить этот пример, у меня здесь только 2 метода.
Теперь у вас есть класс для старого аппаратного API камеры:
И еще один для нового аппаратного API:
Загрузка правильного API
Теперь, чтобы загрузить ваш
CameraOld
илиCameraNew
класс, вам нужно будет проверить уровень API, посколькуCameraNew
он доступен только с уровня API 21.Если у вас уже настроено внедрение зависимостей, вы можете сделать это в своем модуле при предоставлении
CameraSupport
реализации. Пример:Если вы не используете DI, вы можете просто создать утилиту или использовать фабричный шаблон для создания подходящего. Важная часть - проверяется уровень API.
источник
@SuppressWarnings
этом QA stackoverflow.com/questions/7397996/…Столкнулся с той же проблемой , поддерживая старые устройства через устаревший API камеры и нуждаясь в новом API Camera2 как для текущих устройств, так и в будущем; Я столкнулся с теми же проблемами - и не нашел сторонней библиотеки, объединяющей 2 API, вероятно, из-за того, что они очень разные, я обратился к основным принципам ООП .
Эти 2 API заметно отличаются, что затрудняет их замену для клиентских объектов, ожидающих интерфейсов, представленных в старом API. В новом API есть разные объекты с разными методами, построенные с использованием другой архитектуры. Получил любовь к Google, но ragnabbit! это расстраивает.
Поэтому я создал интерфейс, ориентированный только на функции камеры, необходимые моему приложению, и создал простую оболочку для обоих API, реализующих этот интерфейс. Таким образом, моя работа с камерой не должна заботиться о том, на какой платформе она работает ...
Я также установил Singleton для управления API (ами); создание экземпляра старой оболочки API с моим интерфейсом для старых устройств на ОС Android и нового класса оболочки API для новых устройств, использующих новый API. Синглтон имеет типичный код для получения уровня API, а затем экземпляры правильного объекта.
Один и тот же интерфейс используется обоими классами-оболочками , поэтому не имеет значения, работает ли приложение на Jellybean или Marshmallow - до тех пор, пока интерфейс предоставляет моему приложению все, что ему нужно, от любого API камеры с использованием одних и тех же сигнатур методов; камера работает в приложении одинаково как для новых, так и для старых версий Android.
Синглтон также может выполнять некоторые связанные действия, не связанные с API-интерфейсами - например, обнаруживать, что на устройстве действительно есть камера, и сохранять в медиатеке.
Надеюсь, идея вам поможет.
источник
public interface AllCameraInterface { void open(); boolean setDirection(); Bitmap preview(); Bitmap takePhoto(); void close(); }
public interface AllCameraInterface { void open(); Bitmap takePhoto(); void close(); etc... }
public class NCamera implements AllCameraInterface...
public class OCamera implements AllCameraInterface...
public class AllCamera { private static AllCamera ourInstance = new AllCamera(); public static AllCamera getInstance() {...} private AllCameraInterface camera; private AllCamera() { if (android.os.Build.VERSION.SDK_INT <= 20) { camera = new OCamera(); } else { camera = new NCamera(); } }
Тогда способ вернуть его ...camera2
? Я действительно запутался ... Мне просто нуженenableAutofocus
метод, чтобы открыть камеру и установить ее фокус: stackoverflow.com/questions/19076316/…Теперь нам нужно использовать android.hardware.camera2 как android.hardware.Camera устарела и будет работать только с API> 23 FlashLight.
источник
Приведенные здесь ответы о том, какой API камеры использовать, неверны. Или, лучше сказать, их недостаточно.
Некоторые телефоны (например, Samsung Galaxy S6) могут иметь уровень API выше 21, но по-прежнему могут не поддерживать API Camera2.
Класс CameraManager в Camera2Api имеет метод для чтения характеристик камеры. Вы должны проверить, поддерживает ли аппаратное устройство Camera2 Api или нет.
Но есть и другие проблемы, которые нужно решить, если вы действительно хотите, чтобы он работал для серьезного приложения: например, опция автоматической вспышки может не работать для некоторых устройств, или уровень заряда батареи телефона может создать исключение RuntimeException на камере, или телефон может вернуть недопустимый идентификатор камеры и т. д.
Поэтому лучший подход - иметь запасной механизм, поскольку по какой-то причине Camera2 не запускается, вы можете попробовать Camera1, и если это тоже не удастся, вы можете позвонить в Android, чтобы открыть для вас камеру по умолчанию.
источник
источник