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

Новый 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, но также и в новейшей версии...

Ответ 1

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

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

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

Ответ 2

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

    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 сообщает о возврате списка поддерживаемых размеров изображений, однако не все из них фактически поддерживаются.

Ответ 3

Для поддержки 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
 }

Ответ 4

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

    @TargetApi(21)

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

Ответ 5

Я выяснил, что лучшим вариантом является создание двух видов деятельности. Используйте общий способ проверки текущего 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);

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