si android.hardware.Camera
est obsolète et que vous ne pouvez pas utiliser la variable Camera
, quelle serait l'alternative à cela?
97
si android.hardware.Camera
est obsolète et que vous ne pouvez pas utiliser la variable Camera
, quelle serait l'alternative à cela?
android.hardware.camera2
Réponses:
Documentation API
Selon le guide des développeurs Android pour
android.hardware.Camera
, ils déclarent:Sur la page d'informations sur
android.hardware.camera2
, (lien ci-dessus), il est indiqué:Le problème
Lorsque vous consultez cette documentation, vous constaterez que l'implémentation de ces 2 API de caméra est très différente.
Par exemple, activer l'orientation de la caméra
android.hardware.camera
Contre
android.hardware.camera2
Cela rend difficile le passage de l'un à l'autre et l'écriture de code capable de gérer les deux implémentations.
Notez que dans cet exemple de code unique, j'ai déjà dû contourner le fait que l'ancienne API de caméra fonctionne avec des
int
primitives pour les ID de caméra tandis que la nouvelle fonctionne avecString
objets. Pour cet exemple, j'ai rapidement corrigé cela en utilisant int comme index dans la nouvelle API. Si la caméra renvoyée n'est pas toujours dans le même ordre, cela entraînera déjà des problèmes. Une autre approche consiste à travailler avec des objets String et une représentation String des anciens ID caméra int, ce qui est probablement plus sûr.Un loin autour
Maintenant, pour contourner cette énorme différence, vous pouvez d'abord implémenter une interface et référencer cette interface dans votre code.
Ici, je vais énumérer du code pour cette interface et les 2 implémentations. Vous pouvez limiter la mise en œuvre à ce que vous utilisez réellement de l'API de la caméra pour limiter la quantité de travail.
Dans la section suivante, j'expliquerai rapidement comment charger l'un ou l'autre.
L'interface englobe tout ce dont vous avez besoin, pour limiter cet exemple, je n'ai que 2 méthodes ici.
Maintenant, ayez une classe pour l'ancienne API matérielle de la caméra:
Et un autre pour la nouvelle API matérielle:
Chargement de l'API appropriée
Maintenant, pour charger votre classe
CameraOld
ou votreCameraNew
classe, vous devrez vérifier le niveau de l'API car ilCameraNew
n'est disponible qu'à partir du niveau 21 de l'API .Si vous avez déjà configuré l'injection de dépendances, vous pouvez le faire dans votre module lors de la fourniture de l'
CameraSupport
implémentation. Exemple:Si vous n'utilisez pas DI, vous pouvez simplement créer un utilitaire ou utiliser le modèle Factory pour créer le bon. La partie importante est que le niveau d'API est vérifié.
la source
@SuppressWarnings
dans ce QA stackoverflow.com/questions/7397996Face au même problème , prendre en charge les appareils plus anciens via l'API de caméra obsolète et avoir besoin de la nouvelle API Camera2 pour les appareils actuels et pour l'avenir; J'ai rencontré les mêmes problèmes - et je n'ai pas trouvé de bibliothèque tierce qui relie les 2 API, probablement parce qu'elles sont très différentes, je me suis tourné vers les principes de base de la POO .
Les 2 API sont nettement différentes, ce qui rend leur échange problématique pour les objets clients qui attendent les interfaces présentées dans l'ancienne API. La nouvelle API a différents objets avec différentes méthodes, construits en utilisant une architecture différente. J'ai de l'amour pour Google, mais ragnabbit! c'est frustrant.
J'ai donc créé une interface se concentrant uniquement sur la fonctionnalité de la caméra dont mon application a besoin et créé un wrapper simple pour les deux API qui implémente cette interface. De cette façon, mon activité de caméra n'a pas à se soucier de la plate-forme sur laquelle elle s'exécute ...
J'ai également mis en place un Singleton pour gérer les API; instancier le wrapper de l'ancienne API avec mon interface pour les anciens appareils Android OS et la nouvelle classe de wrapper de l'API pour les nouveaux appareils utilisant la nouvelle API. Le singleton a un code typique pour obtenir le niveau d'API, puis installe l'objet correct.
La même interface est utilisée par les deux classes de wrapper , donc peu importe si l'application s'exécute sur Jellybean ou Marshmallow - tant que l'interface fournit à mon application ce dont elle a besoin de l'une ou l'autre API Camera, en utilisant les mêmes signatures de méthode; la caméra fonctionne dans l'application de la même manière pour les versions plus récentes et plus anciennes d'Android.
Le Singleton peut également faire certaines choses liées non liées aux API - comme détecter qu'il y a effectivement une caméra sur l'appareil et enregistrer dans la bibliothèque multimédia.
J'espère que l'idée vous aide.
la source
public interface AllCameraInterface { void open(); boolean setDirection(); Bitmap preview(); Bitmap takePhoto(); void close(); }
public interface AllCameraInterface { void open(); Bitmap takePhoto(); void close(); etc... }
public class NCamera implements AllCameraInterface...
public class OCamera implements AllCameraInterface...
public class AllCamera { private static AllCamera ourInstance = new AllCamera(); public static AllCamera getInstance() {...} private AllCameraInterface camera; private AllCamera() { if (android.os.Build.VERSION.SDK_INT <= 20) { camera = new OCamera(); } else { camera = new NCamera(); } }
Puis une méthode pour le retourner ...camera2
? Je suis vraiment confus ... J'ai juste besoin de laenableAutofocus
méthode pour ouvrir la caméra et définir son objectif: stackoverflow.com/questions/19076316/…Maintenant, nous devons utiliser android.hardware.camera2 car android.hardware.Camera est obsolète et ne fonctionnera que sur API> 23 FlashLight
la source
Les réponses fournies ici selon lesquelles l'API d'appareil photo à utiliser sont incorrectes. Ou mieux dire qu'ils sont insuffisants.
Certains téléphones (par exemple le Samsung Galaxy S6) peuvent être au-dessus du niveau 21 de l'API mais peuvent ne pas prendre en charge l'API Camera2.
La classe CameraManager de Camera2Api a une méthode pour lire les caractéristiques de la caméra. Vous devez vérifier si le périphérique matériel prend en charge Camera2 Api ou non.
Mais il y a plus de problèmes à gérer si vous voulez vraiment le faire fonctionner pour une application sérieuse: comme, l'option de flash automatique peut ne pas fonctionner pour certains appareils ou le niveau de la batterie du téléphone peut créer une exception RuntimeException sur l'appareil photo ou le téléphone peut renvoyer un invalide identifiant de la caméra et etc.
La meilleure approche est donc d'avoir un mécanisme de secours car, pour une raison quelconque, Camera2 ne démarre pas, vous pouvez essayer Camera1 et si cela échoue également, vous pouvez appeler Android pour ouvrir la caméra par défaut pour vous.
la source
la source