Comment utiliser l'API Camera ou Camera2 d'Android pour prendre en charge les anciennes et nouvelles versions d'API sans notes d'obsolescence?

135

La nouvelle API camera2 me déroute. 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".

Cependant, lorsque j'essaye d'ajouter l'API "Camera" (android.hardware.Camera) aux fonctionnalités utilisateur du manifeste, elle est marquée 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 l'API Android 21+ (Android 5 - Lollipop) - Je l'aurais lié aussi, mais je ne peux que rajouter 2 liens.

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

Gee
la source

Réponses:

152

Même si l'ancienne API de caméra est marquée comme obsolète, elle est toujours entièrement fonctionnelle et le restera pendant un certain temps (car presque toutes les applications utilisant une caméra sur le Play Store l'utilisent actuellement).

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

Au niveau de l'API 21, vous pouvez certainement utiliser la nouvelle API et ses nouvelles fonctionnalités, mais actuellement, vous devrez maintenir un flux totalement séparé dans votre application si vous basculez entre les API. Malheureusement, les deux API ont une vision du monde suffisamment différente pour qu'il soit difficile d'écrire une bibliothèque de support qui vous permettrait également d'utiliser quelque chose comme la nouvelle API sur des appareils plus anciens (où la bibliothèque mappe de la nouvelle API à l'ancienne API sinon sur API 21+).

Eddy Talvala
la source
1
Bonne réponse. Donc, si vous souhaitez prendre en charge le niveau d'API 16 et plus, il vaut mieux s'en tenir à l'ancienne caméra pour le moment, non?
Loolooii
5
donc la seule façon est d'utiliser l'instruction if et android.os.Build.VERSION.SDK_INT pour séparer le code?
hadi
Donc, pour un développeur, si vous ciblez uniquement l'API 21 et versions ultérieures, utilisez Camera2, mais si vous avez besoin d'un support hérité, utilisez Camera? Ou recommanderiez-vous de détecter les versions de build et de coder 2 méthodes différentes à l'aide des différentes API?
john.weland
2
Cela dépend de ce que fait votre application. Si la fonctionnalité de la caméra est simple et que vous souhaitez cibler d'anciennes API, utilisez simplement l'ancienne API de caméra. Mais si vous cherchez à faire autre chose que simplement saisir des fichiers JPEG et dessiner un aperçu, ou si vous ciblez simplement de nouvelles API, optez pour camera2. Au milieu (difficile) se trouvent les applications qui souhaitent offrir des fonctionnalités optionnelles sophistiquées sur la caméra2, mais qui fonctionnent également sur les anciens appareils. Là, vous devez créer deux chemins de code distincts, un pour chaque API.
Eddy Talvala
21
La dépréciation de l'API de l'appareil photo était une erreur, ils auraient dû introduire une API avancée pour l'appareil photo (pour les applications avancées telles que les applications d'appareil photo à part entière) - sinon (la plupart) des applications qui utilisent l'appareil photo juste pour prendre une photo devraient maintenir 2 apis. Google devrait avoir au moins introduit une bibliothèque compacte (comme toujours)
Sudara
38

Mettez 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 terrible. Les vendeurs font toujours des implémentations de merde et vous devrez donc ajouter beaucoup de conditions et de solutions de contournement.

Exemple 1 - S6 signale qu'il ne prend pas en charge le flash :) Exemple 2 - Un appareil LG renvoie une liste des tailles d'image prises en charge - cependant, toutes ne sont pas réellement prises en charge !!

slott
la source
14
C'est vrai. L'API Camera 2 divise en fait les appareils photo en trois catégories: LEGACY, LIMITED et FULL. Si la caméra est classée LEGACY, tous les appels d'API de camera2 sont traduits en camera1 sous le capot, donc cela ne vaut vraiment pas la peine. Ma suggestion est d'appeler CameraCharacteristics characteristics = manager.getCameraCharacteristics(cameraID); if (characteristics.get(CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL) == CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL_LEGACY)... et de choisir l'ancienne API si elle est vraie.
panonski
9

Pour prendre en charge l'API de votre choix, utilisez le code ci-dessous. Déterminez simplement les noms appropriés correspondant aux niveaux d'API. Par exemple, l'API 21 est LOLLIPOP et l'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
 }
user0770
la source
33
ce n'est guère pratique pour une mise en œuvre complète de la caméra. de plus, vous devez maintenant gérer deux chemins de code. la vérification de version a son utilité dans le développement Android, mais ce n'est pas ça.
katzenhut
5
Que se passe-t-il si un utilisateur exécute Build.VERSION_CODES.LOLLIPOP_MR1? Ou quelque chose de plus? Je pense que votre deuxième vérification devrait être "else if (Build.VERSION.SDK_INT> = Build.VERSION_CODES.LOLLIPOP)"
Ralph Pina
Chers, comment puis-je intégrer le même appareil photo apk2 et l'ancienne API si mes applications doivent fonctionner dans l'API 16 et plus récente? Les saveurs sont bonnes pour ce travail?
Mateus
Vous devez implémenter les deux API. Gardez simplement une interface et deux classes, où la fonctionnalité de la caméra est implémentée. Avant de créer l'une des instances pour exécuter la caméra, appelez la méthode mentionnée ci-dessus, afin qu'elle puisse savoir quelle classe et quelle fonctionnalité appeler
user0770
3

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

Lorsque vous avez besoin d'une application d'implémentation pour prendre des photos avec le mode de réglage automatique, cela fonctionnera bien. Mais! Si vous avez besoin de créer une application avec l'implémentation du mode de réglage manuel, pour les appareils dotés d'une API> = 21, vérifiez d'abord le NIVEAU MATÉRIEL pris en charge:

Sélectionnez la caméra (avant, face), obtenez ses caractéristiques et vérifiez NIVEAU MATÉRIEL.

mCameraCharacteristics = mCameraManager.getCameraCharacteristics(mCameraId)

val level = mCameraCharacteristics.get(CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL)

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

À un niveau élevé, les niveaux sont:

Les appareils LEGACY fonctionnent dans un mode de compatibilité ascendante pour les appareils Android plus anciens et ont des 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 des paramètres du capteur, du flash, de l'objectif et du post-traitement, ainsi que la capture d'image à une fréquence élevée.

Les périphériques LEVEL_3 prennent également en charge le retraitement YUV et la capture d'image RAW, ainsi que des configurations de flux de sortie supplémentaires.

Si vous avez le niveau de supprot LEGACY , vous devez utiliser l'ancienne Api de l'appareil photo .

Serj
la source
1

Utilisez l'annotation de support

    @TargetApi(21)

pour éviter de vérifier

Prudhvi Raj Kumar
la source
1
Vous ne supportez donc pas les appareils Android avant 21 ans!
Mina F. Beshay
0

Plz read link Prise en charge de la version de la caméra Ils déclarent que ....
Camera API1
Android 5.0 est obsolète Camera API1, qui continue d'être supprimée à mesure que le développement de la nouvelle plate-forme se concentre sur Camera API2. Cependant, la période d'élimination progressive sera longue et les versions d'Android continueront à prendre en charge les applications Camera API1 pendant un certain temps. Plus précisément, le soutien continue pour:

  • Interfaces de la caméra API1 pour les applications. Les applications de caméra construites au-dessus de Camera API1 devraient fonctionner comme elles le font sur les appareils exécutant des versions antérieures d'Android.
  • Versions de caméra HAL. Inclut la prise en charge de la caméra HAL1.0.
  • rajesh780
    la source
    -1

    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 actuelle de l'appareil

    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 à avoir beaucoup de confusion lorsque je regarde le code en arrière. Le code est facile à modifier car il est séparé.

    teck wei
    la source