Как использовать Android Camera или camera2 API для поддержки старых и новых версий API без заметок об устаревании?

112

Новый API камеры22 меня смущает. Я хочу разработать приложение (для Android API 10 - 21), которое использует камеру устройства. Как указано здесь, я должен использовать API-интерфейс "Камера".

Однако, когда я пытаюсь добавить API-интерфейс Camera (android.hardware.Camera) к манифестным пользовательским функциям, он помечен как устаревший. С другой стороны, я не могу изменить его на API-интерфейс "camera2" (android.hardware.camera2), поскольку он совместим только с Android API 21+ (Android 5 - Lollipop). Связал бы и он, но я могу добавить только 2 ссылки.

Я не только хочу, чтобы мое приложение запускалось в более старых версиях Android, но также и в новейшей версии...

Теги:
camera
android-camera2
android-camera

5 ответов

140
Лучший ответ

Несмотря на то, что старый API-интерфейс камеры отмечен как устаревший, он по-прежнему полностью работоспособен и будет оставаться таким довольно долгое время (поскольку почти все приложения, использующие камеру, в Play Store используют его в настоящее время).

Вам придется игнорировать жалобы Android Studio на то, что они устарели, но если вы хотите поддерживать версии Android раньше 21 года, вам придется использовать старый API.

На уровне API уровня 21 вы, безусловно, можете использовать новый API и его новые функции, но в настоящее время вам придется поддерживать полностью отдельный поток в вашем приложении, если вы переключаетесь между API. К сожалению, эти два API имеют совершенно иное мировоззрение, что трудно написать библиотеку поддержки, которая позволит вам использовать что-то вроде нового API на более старых устройствах (где библиотека отображает новый API для старого API, если нет на API 21 +).

  • 1
    Хороший ответ. Так что если вы хотите поддерживать API уровня 16 и выше, лучше придерживаться старой камеры, не так ли?
  • 5
    поэтому единственный способ - использовать оператор if и android.os.Build.VERSION.SDK_INT для разделения кода?
Показать ещё 6 комментариев
28

Поместите все методы с камеры, которые вам нужны в интерфейсе, а затем создайте экземпляр камеры, подобный этому

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
        Log.d(TAG, "camera2 selected");
        this.camera = new Camera2(getContext());
    } else {
        Log.d(TAG, "camera1 selected");
        this.camera = new Camera1(getContext());
    }

Таким образом, вы все разделите, и это сделает вашу жизнь намного проще.

Слово совета - жизнь с камерой2 не так уж велика. Вендеры по-прежнему делают реалистичные реализации, и вам, таким образом, придется добавить много условий и обходных решений.

Пример 1 - S6 сообщает, что он не поддерживает флеш-память:) Пример 2. Устройство LG сообщает о возврате списка поддерживаемых размеров изображений, однако не все из них фактически поддерживаются.

  • 13
    Это правда. API камеры 2 фактически делит устройства камеры на три категории: LEGACY, LIMITED и FULL. Если камера классифицируется как LEGACY, то все вызовы API camera2 переводятся в camera1 под капотом, так что это не стоит беспокоиться. Я предлагаю назвать CameraCharacteristics characteristics = manager.getCameraCharacteristics(cameraID); if (characteristics.get(CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL) == CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL_LEGACY)... и выберите старый API, если он истинный.
8

Для поддержки api вы хотите использовать код ниже. Просто определите соответствующие имена, соответствующие уровням api. Например, API 21 является LOLLIPOP, а API 15 - ICE_CREAM_SANDWICH_MR1.

 if ((Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH_MR1)  
                                    && ((Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP))) {
           // your code here - is between 15-21

 } else if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
           // your code here - is api 21
 }
  • 32
    это вряд ли практично для полной реализации камеры. Кроме того, теперь вы должны поддерживать два кодовых пути. проверка версии имеет свое применение в разработке для Android, но это не так.
  • 5
    Что произойдет, если пользователь запускает Build.VERSION_CODES.LOLLIPOP_MR1? Или что-то выше этого? Я думаю, что ваша вторая проверка должна быть "иначе, если (Build.VERSION.SDK_INT> = Build.VERSION_CODES.LOLLIPOP)"
Показать ещё 2 комментария
0

Используйте аннотацию поддержки

    @TargetApi(21)

чтобы избежать проверки

  • 1
    Таким образом, вы не поддерживаете устройства Android до 21!
-1

Я выяснил, что лучшим вариантом является создание двух видов деятельности. Используйте общий способ проверки текущего API-интерфейса устройства

Intent i;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
    i = new Intent(context,camera2.class)
} else {
    i = new Intent(context,camera.class);
}
startActivity(i);

Таким образом, я не должен иметь много путаницы, когда смотрю код. Код легко модифицировать, поскольку он разделен.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню