Android Kamera android.hardware.Camera veraltet

67

Wenn android.hardware.Camera veraltet ist und Sie die Variable Camera nicht verwenden können, was wäre dann die Alternative?

    
raja121 21.01.2015, 11:18
quelle

3 Antworten

68

API-Dokumentation

Laut dem Android-Entwicklerhandbuch für android.hardware.Camera heißt es:

  

Wir empfehlen die Verwendung der neuen android.hardware.camera2 API für neue Anwendungen.

Auf der Informationsseite über android.hardware.camera2 (oben verlinkt) steht:

  

Das Paket android.hardware.camera2 bietet eine Schnittstelle zu einzelnen Kamerageräten, die mit einem Android-Gerät verbunden sind. Es ersetzt die veraltete Kamera-Klasse.

Das Problem

Wenn Sie diese Dokumentation überprüfen, werden Sie feststellen, dass die Implementierung dieser beiden Kamera-APIs sehr unterschiedlich ist.

Zum Beispiel, um die Kameraausrichtung auf android.hardware.camera

zu bekommen %Vor%

Versus android.hardware.camera2

%Vor%

Dies macht es schwierig, von einem zum anderen zu wechseln und Code zu schreiben, der beide Implementierungen handhaben kann.

Beachten Sie, dass ich in diesem Code-Beispiel bereits die Tatsache umgehen musste, dass die alte Kamera-API mit int primitives für Kamera-IDs arbeitet, während die neue mit String -Objekten arbeitet. In diesem Beispiel habe ich das schnell behoben, indem ich int als Index in der neuen API verwendet habe. Wenn die zurückgegebenen Kameras nicht immer in der gleichen Reihenfolge sind, führt dies bereits zu Problemen. Alternativer Ansatz ist es, mit String-Objekten und String-Repräsentationen der alten int-Kamera-IDs zu arbeiten, was wahrscheinlich sicherer ist.

Einen weg um

Um diesen großen Unterschied zu umgehen, können Sie zuerst eine Schnittstelle implementieren und auf diese Schnittstelle in Ihrem Code verweisen.

Hier werde ich einen Code für diese Schnittstelle und die zwei Implementierungen auflisten. Sie können die Implementierung auf das begrenzen, was Sie tatsächlich von der Kamera-API verwenden, um den Arbeitsaufwand zu begrenzen.

Im nächsten Abschnitt werde ich schnell erklären, wie man den einen oder anderen lädt.

Die Schnittstelle, die alles umhüllt, was Sie brauchen, um dieses Beispiel einzuschränken Ich habe hier nur zwei Methoden.

%Vor%

Habe jetzt eine Klasse für die alte Kamera-Hardware api:

%Vor%

Und noch eins für die neue Hardware-API:

%Vor%

Laden der richtigen API

Um nun entweder Ihre CameraOld oder CameraNew Klasse zu laden, müssen Sie die API Ebene überprüfen, da CameraNew nur von API 21 verfügbar ist.

Wenn Sie bereits Dependency-Injection eingerichtet haben, können Sie dies in Ihrem Modul tun, wenn Sie die CameraSupport -Implementierung bereitstellen. Beispiel:

%Vor%

Wenn Sie DI nicht verwenden, können Sie einfach ein Dienstprogramm erstellen oder das Factory-Muster verwenden, um das richtige zu erstellen. Wichtiger Teil ist, dass die API-Ebene überprüft wird.

    
user4469467 21.01.2015, 11:26
quelle
5

Mit demselben Problem konfrontiert ältere Geräte über die veraltete Kamera-API zu unterstützen und die neue Camera2-API sowohl für aktuelle Geräte als auch für die Zukunft zu benötigen; Ich stieß auf die gleichen Probleme - und habe nicht eine Bibliothek von Drittanbietern gefunden, die die zwei APIs überbrückt, wahrscheinlich weil sie sehr unterschiedlich sind, Ich wandte mich an grundlegende OOP-Prinzipien .

Die beiden APIs unterscheiden sich deutlich voneinander, so dass sie für Clientobjekte, die die in der alten API dargestellten Schnittstellen erwarten, problematisch sind. Die neue API verfügt über verschiedene Objekte mit unterschiedlichen Methoden, die mit einer anderen Architektur erstellt wurden. Habe Liebe für Google, aber Ragnabbit! das ist frustrierend.

Also habe ich eine Schnittstelle geschaffen, die sich nur auf die Kamera-Funktionalität meiner App konzentriert und einen einfachen Wrapper für beide APIs erstellt, der diese Schnittstelle implementiert. So meine Kamera-Aktivität muss sich nicht darum kümmern, auf welcher Plattform es läuft ...

Ich habe auch einen Singleton eingerichtet, um die API (s) zu verwalten; Die Wrapper der älteren API werden mit meiner Schnittstelle für ältere Android OS-Geräte und die Wrapper-Klasse der neuen API für neuere Geräte mit der neuen API aktualisiert. Der Singleton hat typischen Code, um die API-Ebene zu erhalten, und führt dann das korrekte Objekt aus.

Die gleiche Schnittstelle wird von beiden Wrapper-Klassen verwendet , es spielt also keine Rolle, ob die App auf Jellybean oder Marshmallow läuft - solange die Schnittstelle meiner App das bietet, was sie von beiden benötigt Kamera-API mit den gleichen Methodensignaturen; Die Kamera läuft in der App auf die gleiche Weise für neuere und ältere Versionen von Android.

Der Singleton kann auch einige damit zusammenhängende Dinge tun, die nicht an die APIs gebunden sind - wie das Erkennen, dass sich tatsächlich eine Kamera auf dem Gerät befindet und das Speichern in der Medienbibliothek.

Ich hoffe, die Idee hilft Ihnen.

    
Robert Sherman 16.06.2016 18:25
quelle
0

Jetzt müssen wir android.hardware.camera2 als android.hardware.Camera verwenden, was nur für API & gt; 23 FlashLight

gilt %Vor%     
quelle