web-dev-qa-db-fra.com

Comment utiliser l'API camera ou camera2 d'Android pour prendre en charge les anciennes et les nouvelles versions d'API sans notes de dépréciation?

La nouvelle API camera2 me perturbe. Je souhaite développer une application (pour Android API 10 - 21) qui utilise l'appareil photo de l'appareil. Comme indiqué ici , je devrais utiliser l'API "Camera".

Cependant, lorsque j'essaie d'ajouter l'API "Appareil photo" (Android.hardware.Camera) aux fonctions 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 est uniquement compatible avec Android API 21+. (Android 5 - Lollipop) - L'aurais lié aussi, mais je ne peux ajouter que 2 liens.

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

131
Gee

Même si l'ancienne API de caméra est marquée comme obsolète, elle est toujours pleinement fonctionnelle et le restera encore longtemps (car presque toutes les applications utilisant des caméras sur le Play Store l'utilisent actuellement).

Vous devrez ignorer les réclamations de Android Studio concernant son obsolescence, mais si vous souhaitez prendre en charge les versions de Androidantérieures à 21, vous devez utiliser l'ancienne API.

Sur le niveau 21 de l'API, vous pouvez certainement utiliser la nouvelle API et ses nouvelles fonctionnalités, mais vous devez actuellement gérer un flux totalement séparé dans votre application si vous passez d'une API à une autre. 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 d'utiliser quelque chose comme la nouvelle API sur des périphériques plus anciens (où la bibliothèque est mappée de la nouvelle API sur l'ancienne sur API 21+).

152
Eddy Talvala

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, tout sera divisé et cela facilitera votre vie.

Conseil - la vie avec camera2 n’est pas terrible. Les vendeurs continuent à implémenter de la 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 Flash :) Exemple 2 - Un périphérique LG renvoie une liste des tailles d'image prises en charge. Cependant, elles ne sont pas toutes prises en charge!

38
slott

Pour soutenir l’API que vous voulez, utilisez le code ci-dessous. Il suffit de déterminer les noms appropriés correspondant aux niveaux de l’API. Par exemple, API 21 correspond à Lollipop et 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
 }
9
user0770

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

Lorsque vous avez besoin d'une application pour prendre des photos avec le mode de réglage automatique, tout fonctionne correctement. Mais! Si nécessaire, créez une application avec une implémentation en mode de paramétrage manuel. Pour les appareils dont l'API est> = 21, commencez par vérifier les niveaux de matériel pris en charge:

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

mCameraCharacteristics = mCameraManager.getCameraCharacteristics(mCameraId)

val level = mCameraCharacteristics.get(CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL)

Les caractéristiques de la caméra représentent les niveaux supportés suivants: LIMITED, FULL, LEGACY, LEVEL_3, EXTERNAL.

À un niveau élevé, les niveaux sont les suivants:

APPAREILS HÉRITÉS les appareils fonctionnent en mode de compatibilité ascendante pour les appareils plus anciens Android et ont des capacités très limitées.

LIMITED les périphériques 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.

COMPLET les périphériques 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'images à une cadence élevée.

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

Si vous avez le niveau de supprot LEGACY, vous devriez tiliser l'ancienne caméra Api.

3
Serj

Utilisez l'annotation de support

    @TargetApi(21)

pour éviter de vérifier

1
Prudhvi Raj Kumar