it-swarm.com.de

Wie verwende ich die Kamera- oder Kamera2-API von Android, um alte und neue API-Versionen ohne Verfallserklärungen zu unterstützen?

Die neue Kamera2-API verwirrt mich. Ich möchte eine App (für Android APIs 10 - 21) entwickeln, die die Kamera des Geräts verwendet. hier , ich sollte die "Kamera" -API verwenden.

Wenn ich jedoch versuche, die "Kamera" -API (Android.hardware.Camera) zu den Benutzerfunktionen des Manifests hinzuzufügen, sie ist als veraltet markiert . Andererseits kann ich es nicht auf die "camera2" -API ändern (Android.hardware.camera2), da es nur mit Android API 21+) kompatibel ist (Android 5 - Lollipop) - Hätte es auch verlinkt, aber ich kann nur 2 Links hinzufügen.

Ich möchte nicht nur, dass meine App auf älteren Versionen von Android läuft, sondern auch auf der neuesten ...

131
Gee

Obwohl die alte Kamera-API als veraltet markiert ist, ist sie immer noch voll funktionsfähig und wird dies noch eine Weile bleiben (da sie derzeit von fast allen kamerabetriebenen Anwendungen im Play Store verwendet wird).

Sie müssen Android Studio's Beschwerden ignorieren, dass es veraltet ist, aber wenn Sie Android Versionen vor 21 unterstützen möchten, müssen Sie die alte verwenden API.

Auf API-Ebene 21 können Sie zwar die neue API und ihre neuen Funktionen verwenden, derzeit müssen Sie jedoch einen vollständig separaten Ablauf in Ihrer App beibehalten, wenn Sie zwischen den APIs wechseln. Leider haben die beiden APIs eine so unterschiedliche Weltsicht, dass es schwierig ist, eine Unterstützungsbibliothek zu schreiben, mit der Sie so etwas wie die neue API auch auf älteren Geräten verwenden können (wenn nicht, ordnet die Bibliothek die neue API der alten API zu) auf API 21+).

152
Eddy Talvala

Fügen Sie alle Methoden der Kamera, die Sie benötigen, in eine Benutzeroberfläche ein und erstellen Sie dann eine Kamerainstanz wie diese

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

Auf diese Weise lässt sich alles aufteilen und Ihr Leben wird so viel einfacher.

Ein Tipp - das Leben mit camera2 ist nicht so toll. Venders führen immer noch Mistimplementierungen durch, und Sie müssen daher viele Bedingungen und Problemumgehungen hinzufügen.

Beispiel 1 - S6 meldet, dass es kein Flash unterstützt :) Beispiel 2 - Ein LG Gerät meldet eine Liste der unterstützten Bildgrößen - jedoch werden nicht alle von ihnen tatsächlich unterstützt !!

38
slott

Verwenden Sie den folgenden Code, um die von Ihnen gewünschte API zu unterstützen. Bestimmen Sie einfach die entsprechenden Namen der entsprechenden API-Ebenen. API 21 ist beispielsweise Lollipop und API 15 ist 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
 }
9
user0770

Wofür Google die Verwendung von Camera2 Api> = 21 empfiehlt, könnte man aber Probleme mit manuellen Einstellungen haben.

Wenn Sie eine App zum Aufnehmen von Fotos mit dem automatischen Einstellungsmodus benötigen, funktioniert dies problemlos. Aber! Wenn Sie eine App mit der Implementierung des manuellen Einstellungsmodus erstellen müssen, müssen Sie zunächst für Geräte mit API> = 21 die unterstützte HARDWARE-STUFE überprüfen:

Wählen Sie die Kamera (Vorderseite, Gesicht) aus, rufen Sie deren Eigenschaften ab und überprüfen Sie den HARDWARE-STAND.

mCameraCharacteristics = mCameraManager.getCameraCharacteristics(mCameraId)

val level = mCameraCharacteristics.get(CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL)

CameraCharacteristics stehen für die nächsten unterstützten Ebenen: LIMITED, FULL, LEGACY, LEVEL_3, EXTERNAL.

Auf hohem Niveau sind die Niveaus:

LEGACY Geräte arbeiten im Abwärtskompatibilitätsmodus für ältere Android Geräte) und haben nur sehr eingeschränkte Funktionen.

LIMITED Geräte stellen den Basissatz der Funktionen dar und können auch zusätzliche Funktionen enthalten, die Teilmengen von FULL sind.

FULL Geräte unterstützen zusätzlich die manuelle Steuerung von Sensor-, Blitz-, Objektiv- und Nachbearbeitungseinstellungen pro Bild sowie die Bilderfassung mit hoher Geschwindigkeit.

LEVEL_ Geräte unterstützen zusätzlich YUV-Wiederaufbereitung und RAW-Bilderfassung sowie zusätzliche Konfigurationen für Ausgabestreams.

Wenn Sie das LEGACY Supprot-Level haben, sollten Sie alte Kamera-API verwenden.

3
Serj

Verwenden Sie die Support-Anmerkung

    @TargetApi(21)

zu überprüfen vermeiden

1