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

135

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

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

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

вот здорово
источник

Ответы:

152

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

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

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

Эдди Талвала
источник
1
Хороший ответ. Так что, если вы хотите поддерживать уровень API 16 и выше, лучше пока придерживаться старой камеры, верно?
Loolooii
5
так что единственный способ - использовать оператор if и android.os.Build.VERSION.SDK_INT для разделения кода?
Хади
Так что для разработчика, если вы ориентируетесь только на API 21 и выше, используйте Camera2, но если вам нужна поддержка предыдущих версий, используйте Camera? Или вы бы порекомендовали определять версии сборки и кодировать 2 разных метода с использованием разных API?
john.weland
2
Это зависит от того, что делает ваше приложение. Если функциональность камеры проста в наведении и съемке, и вы хотите использовать старые API-интерфейсы, просто используйте старый API-интерфейс камеры. Но если вы хотите сделать что-то большее, чем просто захват изображений в формате JPEG и предварительный просмотр отрисовки, или если вы просто ориентируетесь на новые API, используйте camera2. В (жесткой) середине находятся приложения, которые хотят предложить необычные дополнительные функции для camera2, но также работают и на старых устройствах. Там вы должны создать два отдельных кодовых пути, по одному для каждого API.
Эдди Талвала
21
Упразднение API камеры было ошибкой, они должны были ввести расширенный API камеры (для расширенных приложений, таких как полноценные приложения для камеры) - в противном случае (большинству) приложений, которые используют камеру только для съемки фотографии, пришлось бы поддерживать 2 API. Google должен был по крайней мере представить компактную библиотеку (как всегда)
Судара
38

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

    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());
    }

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

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

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

Слотт
источник
14
Это верно. 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, если это правда.
Панонски
9

Для поддержки 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
 }
user0770
источник
33
это вряд ли практично для полной реализации камеры. Кроме того, теперь вам нужно поддерживать два кодовых пути. проверка версии действительно используется при разработке Android, но это не так.
Каценхут
5
Что произойдет, если пользователь запускает Build.VERSION_CODES.LOLLIPOP_MR1? Или что-то выше этого? Я думаю, что ваша вторая проверка должна быть "иначе, если (Build.VERSION.SDK_INT> = Build.VERSION_CODES.LOLLIPOP)"
Ральф Пина
Уважаемые, как я могу встроить один и тот же apk camera2 и старый api, если мои приложения должны работать с api версии 16 и новее? Ароматизаторы хороши для этой работы?
Mateus
Вы должны реализовать оба API. Просто оставьте интерфейс и два класса, в которых реализована функциональность камеры. Перед созданием одного из экземпляров для работающей камеры вызовите метод, упомянутый выше, чтобы он мог узнать, какой класс и функциональность вызывать
user0770
3

Хотя, что Google рекомендует использовать Camera2 Api> = 21, но у вас могут возникнуть проблемы с ручными настройками.

Когда вам понадобится приложение для фотографирования в режиме автоматической настройки, оно будет работать нормально. Но! Если необходимо создать приложение с реализацией в режиме ручной настройки, для устройств с API> = 21, во-первых, необходимо проверить поддерживаемый уровень аппаратного обеспечения:

Выберите камеру (Front, Face), получите ее характеристики и проверьте УРОВЕНЬ ОБОРУДОВАНИЯ.

mCameraCharacteristics = mCameraManager.getCameraCharacteristics(mCameraId)

val level = mCameraCharacteristics.get(CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL)

Характеристики камеры представляют следующие поддерживаемые уровни: LIMITED, FULL, LEGACY, LEVEL_3, EXTERNAL.

На высоком уровне это следующие уровни:

Устаревшие устройства работают в режиме обратной совместимости со старыми устройствами Android и имеют очень ограниченные возможности.

ОГРАНИЧЕННЫЕ устройства представляют собой базовый набор функций и могут также включать дополнительные возможности, которые являются подмножествами ПОЛНОГО.

ПОЛНЫЕ устройства дополнительно поддерживают покадровое ручное управление настройками датчика, вспышки, объектива и последующей обработки, а также захват изображения с высокой скоростью.

Устройства LEVEL_3 дополнительно поддерживают повторную обработку YUV и захват изображений RAW, а также дополнительные конфигурации выходного потока.

Если у вас есть уровень поддержки LEGACY , вам следует использовать старый Camera Api .

Serj
источник
1

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

    @TargetApi(21)

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

Прудхви Радж Кумар
источник
1
Таким образом, вы не поддерживаете устройства Android до 21!
Мина Ф. Бешай
0

Пожалуйста, прочтите ссылку Поддержка версии камеры. Они заявляют, что ....
Camera API1
Android 5.0 устарел Camera API1, который постепенно прекращается, поскольку разработка новой платформы сосредоточена на Camera API2. Однако период поэтапного отказа будет продолжительным, и выпуски Android будут поддерживать приложения Camera API1 еще некоторое время. В частности, поддержка продолжается для:

  • Интерфейсы API1 камеры для приложений. Приложения камеры, созданные на основе Camera API1, должны работать так же, как на устройствах под управлением более ранних версий Android.
  • Версии камеры HAL. Включает поддержку камеры HAL1.0.
  • rajesh780
    источник
    -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);

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

    Тек Вэй
    источник