Wie verwende ich die Kamera oder die camera2-API von Android, um alte und neue API-Versionen ohne Verfallsnotizen zu unterstützen?

135

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

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

Ich möchte nicht nur, dass meine App auf älteren Android-Versionen ausgeführt wird, sondern auch auf der neuesten ...

Gee
quelle

Antworten:

152

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

Sie müssen die Beschwerden von Android Studio ignorieren, dass es veraltet ist. Wenn Sie jedoch Android-Versionen vor 21 unterstützen möchten, müssen Sie die alte API verwenden.

Auf API-Ebene 21 können Sie die neue API und ihre neuen Funktionen zwar verwenden, aber derzeit müssen Sie einen völlig separaten Ablauf in Ihrer App beibehalten, wenn Sie zwischen den APIs wechseln. Leider haben die beiden APIs eine so unterschiedliche Weltanschauung, 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 (wobei die Bibliothek von der neuen API auf die alte API abgebildet wird, wenn nicht auf API 21+).

Eddy Talvala
quelle
1
Gute Antwort. Wenn Sie also API Level 16 und höher unterstützen möchten, ist es besser, vorerst bei der alten Kamera zu bleiben, oder?
Loolooii
5
Der einzige Weg ist also, if-Anweisung und android.os.Build.VERSION.SDK_INT zu verwenden, um den Code zu trennen.
Hadi
Wenn Sie als Entwickler nur auf API 21 und höher abzielen, verwenden Sie Camera2. Wenn Sie jedoch ältere Unterstützung benötigen, verwenden Sie Camera? Oder würden Sie empfehlen, Build-Versionen zu erkennen und zwei verschiedene Methoden mithilfe der verschiedenen APIs zu codieren?
John.Weland
2
Es hängt davon ab, was Ihre App tut. Wenn die Kamerafunktionalität unkompliziert ist und Sie auf alte APIs abzielen möchten, verwenden Sie einfach die alte Kamera-API. Wenn Sie jedoch mehr als nur JPEGs abrufen und eine Vorschau zeichnen möchten oder nur auf neue APIs abzielen möchten, entscheiden Sie sich für camera2. In der (harten) Mitte befinden sich Apps, die ausgefallene optionale Funktionen für camera2 bieten möchten, aber auch auf alten Geräten funktionieren. Dort müssen Sie zwei separate Codepfade erstellen, einen für jede API.
Eddy Talvala
21
Das Verwerfen der Kamera-API war ein Fehler. Sie hätten eine erweiterte Kamera-API einführen sollen (für erweiterte Apps wie vollwertige Kamera-Apps). Andernfalls müssten (die meisten) Apps, die die Kamera nur zum Fotografieren verwenden, 2 Apis warten. Google sollte mindestens eine kompakte Bibliothek eingeführt haben (wie immer)
Sudara
38

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

    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 haben Sie alles aufgeteilt und es wird Ihr Leben so viel einfacher machen.

Ratschlag - das Leben mit camera2 ist nicht so toll. Verkäufer machen immer noch Mistimplementierungen und Sie müssen daher viele Bedingungen und Problemumgehungen hinzufügen.

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

Slott
quelle
14
Das ist wahr. Die Kamera 2-API unterteilt Kamerageräte in drei Kategorien: LEGACY, LIMITED und FULL. Wenn die Kamera als LEGACY klassifiziert ist, werden alle API-Aufrufe von camera2 unter der Haube in camera1 übersetzt, sodass sich die Mühe wirklich nicht lohnt. Mein Vorschlag ist CameraCharacteristics characteristics = manager.getCameraCharacteristics(cameraID); if (characteristics.get(CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL) == CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL_LEGACY)... , die alte API aufzurufen und auszuwählen, wenn sie wahr ist.
Panonski
9

Verwenden Sie den folgenden Code, um die gewünschte API zu unterstützen. Bestimmen Sie einfach die entsprechenden Namen, die den API-Ebenen entsprechen. Beispielsweise ist API 21 LOLLIPOP und 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
quelle
33
Dies ist für eine vollständige Kameraimplementierung kaum praktikabel. Außerdem müssen Sie jetzt zwei Codepfade pflegen. Die Versionsprüfung hat ihre Verwendung in der Android-Entwicklung, aber das ist es nicht.
Katzenhut
5
Was passiert, wenn ein Benutzer Build.VERSION_CODES.LOLLIPOP_MR1 ausführt? Oder etwas darüber? Ich denke, Ihre zweite Prüfung sollte "else if (Build.VERSION.SDK_INT> = Build.VERSION_CODES.LOLLIPOP)" sein
Ralph Pina
Meine Lieben, wie kann ich dieselbe apk camera2 und alte api einbauen, wenn meine Apps in der 16 und neueren api funktionieren sollen? Aromen ist gut für diese Arbeit?
Mateus
Sie müssen beide APIs implementieren. Behalten Sie einfach eine Schnittstelle und zwei Klassen bei, in denen die Kamerafunktionalität implementiert ist. Rufen Sie vor dem Erstellen einer der Instanzen zum Ausführen der Kamera die oben genannte Methode auf, um herauszufinden, welche Klasse und Funktionalität aufgerufen werden soll
user0770
3

Obwohl, was Google empfiehlt, verwenden Sie Camera2 Api> = 21, aber Sie könnten Probleme mit manuellen Einstellungen haben.

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

Wählen Sie die Kamera (Vorderseite, Gesicht), ermitteln Sie die Eigenschaften und überprüfen Sie die HARDWARE-EBENE.

mCameraCharacteristics = mCameraManager.getCameraCharacteristics(mCameraId)

val level = mCameraCharacteristics.get(CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL)

CameraCharacteristics repräsentieren die nächsten unterstützten Ebenen: LIMITED, FULL, LEGACY, LEVEL_3, EXTERNAL.

Auf einem hohen Niveau sind die Niveaus:

LEGACY- Geräte arbeiten für ältere Android-Geräte in einem Abwärtskompatibilitätsmodus und verfügen nur über sehr eingeschränkte Funktionen.

LIMITED- Geräte stellen den Basisfeature-Satz 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 Frame sowie die Bilderfassung mit hoher Geschwindigkeit.

STUFE 3 Geräte unterstützen zusätzlich die YUV-Wiederaufbereitung und die RAW-Bilderfassung sowie zusätzliche Konfigurationen für den Ausgabestream.

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

Serj
quelle
1

Verwenden Sie die Support-Annotation

    @TargetApi(21)

um eine Überprüfung zu vermeiden

Prudhvi Raj Kumar
quelle
1
Sie unterstützen die Android-Geräte also nicht vor 21!
Mina F. Beshay
0

Plz read link Unterstützung der Kameraversion Sie geben an, dass ...
Kamera-API1
Android 5.0 veraltete Kamera-API1, die weiterhin ausläuft, da sich die Entwicklung neuer Plattformen auf die Kamera-API2 konzentriert. Die Auslaufphase wird jedoch lang sein, und Android-Versionen werden noch einige Zeit die Kamera-API1-Apps unterstützen. Insbesondere wird die Unterstützung für Folgendes fortgesetzt:

  • Kamera-API1-Schnittstellen für Apps. Kamera-Apps, die auf der Kamera-API1 basieren, sollten genauso funktionieren wie auf Geräten, auf denen frühere Android-Versionen ausgeführt werden.
  • Kamera HAL Versionen. Beinhaltet Unterstützung für Kamera HAL1.0.
  • rajesh780
    quelle
    -1

    Ich fand heraus, dass die beste Option darin besteht, zwei Aktivitäten zu erstellen. Verwenden Sie die allgemeine Methode, um nach der aktuellen Geräte-API zu suchen

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

    Auf diese Weise muss ich nicht viel Verwirrung stiften, wenn ich auf den Code zurückblicke. Der Code kann leicht geändert werden, da er getrennt ist.

    teck wei
    quelle