Comment utiliser l’appareil photo ou l’API camera2 d’Android pour prendre en charge les anciennes et les nouvelles versions de l’API sans prendre en compte les remarques?

La nouvelle API camera2 me déconcerte. Je souhaite développer une application (pour les API Android 10 – 21) qui utilise la caméra de l’appareil. Comme indiqué ici , je devrais utiliser l’API “Camera”.

Toutefois, lorsque j’essaie d’append l’API “Camera” (android.hardware.Camera) aux fonctionnalités utilisateur du manifeste, il est marqué comme obsolète . Par contre, je ne peux pas le changer pour l’API “camera2” (android.hardware.camera2) car il n’est compatible qu’avec Android API 21+ (Android 5 – Lollipop). 2 liens.

Non seulement je veux que mon application fonctionne sur les anciennes versions d’Android, mais aussi la plus récente …

Même si l’ancienne API de caméra est considérée comme obsolète, elle est toujours fonctionnelle et le restra encore longtemps (comme presque toutes les applications utilisant des caméras du Play Store l’utilisent actuellement).

Vous devrez ignorer les plaintes d’Android Studio à ce sujet, mais si vous souhaitez prendre en charge les versions d’Android antérieures à 21, vous devez utiliser l’ancienne API.

Au niveau 21 de l’API, vous pouvez certainement utiliser la nouvelle API et ses nouvelles fonctionnalités, mais vous devrez actuellement gérer un stream totalement distinct dans votre application si vous passez d’une API à l’autre. Malheureusement, les deux API ont une vision du monde assez différente, car il est difficile d’écrire une bibliothèque de support qui vous permettrait également d’utiliser une nouvelle API sur des périphériques plus anciens (où la bibliothèque mappe de la nouvelle API à l’ancienne API). sur API 21+).

Placez toutes les méthodes de la caméra dont vous avez besoin dans une interface, puis créez une instance de caméra comme celle-ci

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

De cette façon, vous aurez tout divisé et cela vous facilitera la vie.

Un conseil – la vie avec camera2 n’est pas géniale. Les fournisseurs continuent à réaliser des implémentations de crap et vous devrez donc append beaucoup de conditions et de solutions.

Exemple 1 – S6 signale qu’il ne prend pas en charge le flash 🙂 Exemple 2 – Un appareil LG affiche une liste des tailles d’image sockets en charge – mais toutes ne sont pas réellement sockets en charge!

Pour supporter api vous voulez, utilisez le code ci-dessous. Il suffit de déterminer les noms appropriés correspondant aux niveaux d’API. Par exemple, API 21 est LOLLIPOP et API 15 est 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 } 

Bien que ce que Google recommande d’utiliser Camera2 Api> = 21, vous pourriez avoir des problèmes avec les parameters manuels.

Lorsque vous avez besoin d’une application pour prendre des photos avec le mode de réglage automatique, cela fonctionnera correctement. Mais! Si besoin créer une application avec l’implémentation du mode de réglage manuel, pour les périphériques qui ont API> = 21, tout d’abord, il faut vérifier le niveau de matériel supporté:

Sélectionnez la caméra (Front, Face), obtenez ses caractéristiques et vérifiez le niveau de matériel.

 mCameraCharacteristics = mCameraManager.getCameraCharacteristics(mCameraId) val level = mCameraCharacteristics.get(CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL) 

CameraCharacteristics représente les niveaux suivants pris en charge: LIMITED, FULL, LEGACY, LEVEL_3, EXTERNAL.

Au plus haut niveau, les niveaux sont les suivants:

Les appareils LEGACY fonctionnent en mode de compatibilité ascendante pour les anciens appareils Android et disposent de capacités très limitées.

Les périphériques LIMITED représentent l’ensemble des fonctionnalités de base et peuvent également inclure des fonctionnalités supplémentaires qui sont des sous-ensembles de FULL.

Les appareils FULL prennent également en charge le contrôle manuel par image du capteur, du flash, des objectives et des parameters de post-traitement, ainsi que la capture d’images à un taux élevé.

Les appareils LEVEL_3 prennent également en charge le retraitement YUV et la capture d’images RAW, ainsi que des configurations de stream de sortie supplémentaires.

Si vous avez le niveau LEGACY supprot, vous devriez utiliser l’ancien Camera Api .

Utiliser l’annotation de support

  @TargetApi(21) 

pour éviter de vérifier

J’ai découvert que la meilleure option était de créer deux activités. Utilisez la méthode générale pour vérifier l’API du périphérique actuel

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

De cette façon, je n’ai pas beaucoup de confusion lorsque je regarde le code. Le code est facile à modifier car il est séparé.