Come utilizzare la fotocamera o l'API camera2 di Android per supportare le versioni API vecchie e nuove senza note di deprecazione?


135

La nuova API camera2 mi confonde. Voglio sviluppare un'app (per le API Android 10 - 21) che utilizza la fotocamera del dispositivo. Come indicato qui , dovrei usare l'API "Camera".

Tuttavia, quando provo ad aggiungere l'API "Camera" (android.hardware.Camera) alle funzionalità utente del manifest, viene contrassegnato come obsoleto . D'altra parte, non posso cambiarlo nell'API "camera2" (android.hardware.camera2) poiché è compatibile solo con l'API Android 21+ (Android 5 - Lollipop) - Lo avrei collegato anche io, ma posso solo aggiungere 2 collegamenti.

Non voglio solo che la mia app venga eseguita su versioni precedenti di Android, ma anche la più recente ...

Risposte:


152

Anche se la vecchia API della fotocamera è contrassegnata come obsoleta, è ancora perfettamente funzionante e rimarrà tale per un bel po '(poiché quasi tutte le applicazioni che usano la fotocamera sul Play Store la usano attualmente).

Dovrai ignorare le lamentele di Android Studio in merito al fatto che è stato deprecato, ma se desideri supportare versioni di Android precedenti alla 21, devi utilizzare la vecchia API.

A livello di API 21, puoi sicuramente utilizzare la nuova API e le sue nuove funzionalità, ma al momento dovrai passare un flusso completamente separato nella tua app se passi da un'API all'altra. Sfortunatamente, le due API hanno una visione del mondo abbastanza diversa che è difficile scrivere una libreria di supporto che ti consenta di utilizzare qualcosa di simile alla nuova API anche su dispositivi più vecchi (dove la libreria esegue il mapping dalla nuova API alla vecchia API se non su API 21+).


1
Buona risposta. Quindi, se vuoi supportare API di livello 16 o superiore, è meglio attenersi alla vecchia fotocamera per ora, giusto?
Loolooii,

5
quindi l'unico modo è usare if statement e android.os.Build.VERSION.SDK_INT per separare il codice?
Hadi,

Quindi, per uno sviluppatore, se stai solo prendendo di mira l'API 21 e successive, usa Camera2 ma se hai bisogno di supporto legacy usa Camera? O consiglieresti di rilevare versioni di build e codificare 2 metodi diversi utilizzando le diverse API?
john.weland,

2
Dipende da cosa fa la tua app. Se la funzionalità della fotocamera è semplice, inquadra e scatta e vuoi scegliere come target le vecchie API, utilizza semplicemente la vecchia API della fotocamera. Ma se stai cercando di fare qualcosa di più che catturare JPEG e disegnare un'anteprima, o se stai semplicemente prendendo di mira nuove API, vai con camera2. Nel mezzo (difficile) ci sono app che vogliono offrire fantastiche funzioni opzionali su camera2, ma funzionano anche su vecchi dispositivi. Lì, devi costruire due codepath separati, uno per ogni API.
Eddy Talvala,

21
Deprecare l'API della fotocamera è stato un errore, avrebbero dovuto introdurre un'API avanzata della fotocamera (per app avanzate come app a pieno titolo per la fotocamera) - altrimenti (la maggior parte) le app che usano la fotocamera solo per scattare una foto dovrebbero mantenere 2 API. Google avrebbe dovuto almeno introdurre una libreria compatta (come sempre)
Sudara,

38

Inserisci tutti i metodi della videocamera che ti servono in un'interfaccia e quindi crea un'istanza della videocamera come questa

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

In questo modo avrai tutto diviso e renderà la tua vita molto più semplice.

Un consiglio: la vita con camera2 non è eccezionale. I venditori continuano a implementare cazzate e dovrete quindi aggiungere molte condizioni e soluzioni alternative.

Esempio 1 - S6 segnala che non supporta il flash :) Esempio 2 - Un dispositivo LG riporta un elenco di dimensioni di immagini supportate, tuttavia non tutte sono effettivamente supportate !!


14
Questo è vero. L'API camera 2 divide effettivamente i dispositivi della fotocamera in tre categorie: LEGACY, LIMITED e FULL. Se la fotocamera è classificata come LEGACY, tutte le chiamate API camera2 vengono tradotte in camera1 sotto il cofano, quindi non vale davvero la pena. Il mio consiglio è di chiamare CameraCharacteristics characteristics = manager.getCameraCharacteristics(cameraID); if (characteristics.get(CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL) == CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL_LEGACY)... e scegliere la vecchia API se è vera.
Panonski,

9

Per supportare api che desideri, usa il codice qui sotto. Basta determinare i nomi appropriati corrispondenti livelli API. Ad esempio, l'API 21 è LOLLIPOP e l'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
 }

33
questo non è pratico per un'implementazione completa della fotocamera. inoltre, ora devi mantenere due codepati. il controllo della versione ha il suo utilizzo nello sviluppo Android, ma non è così.
Katzenhut,

5
Cosa succede se un utente esegue Build.VERSION_CODES.LOLLIPOP_MR1? O qualcosa di più? Penso che il tuo secondo controllo dovrebbe essere "altrimenti if (Build.VERSION.SDK_INT> = Build.VERSION_CODES.LOLLIPOP)"
Ralph Pina,

Carissimi, come posso integrare la stessa apk camera2 e la vecchia API se le mie app dovrebbero funzionare nella API 16 e successive? I sapori sono buoni per questo lavoro?
Mateus,

Devi implementare entrambe le API. Basta mantenere un'interfaccia e due classi, in cui è implementata la funzionalità della fotocamera. Prima di creare una delle istanze per l'esecuzione della fotocamera, chiama il metodo sopra menzionato, in modo che possa scoprire quale classe e funzionalità chiamare
user0770

3

Tuttavia, ciò che Google consiglia di utilizzare Camera2 Api> = 21, ma potresti avere problemi con le impostazioni manuali.

Quando hai bisogno di implementare l'app per scattare foto con la modalità di impostazione automatica, funzionerà benissimo. Ma! Se è necessario creare un'app con l'implementazione della modalità di impostazione manuale, per i dispositivi con API> = 21, in primo luogo, è necessario controllare il LIVELLO HARDWARE supportato:

Seleziona la fotocamera (frontale, frontale), ottieni le caratteristiche e controlla LIVELLO HARDWARE.

mCameraCharacteristics = mCameraManager.getCameraCharacteristics(mCameraId)

val level = mCameraCharacteristics.get(CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL)

Le caratteristiche della fotocamera rappresentano i seguenti livelli supportati: LIMITATO, COMPLETO, LEGACY, LEVEL_3, EXTERNAL.

Ad un livello elevato, i livelli sono:

I dispositivi LEGACY funzionano in una modalità di retrocompatibilità per i dispositivi Android meno recenti e hanno funzionalità molto limitate.

I dispositivi LIMITED rappresentano il set di funzionalità di base e possono includere anche funzionalità aggiuntive che sono sottoinsiemi di FULL.

I dispositivi FULL supportano inoltre il controllo manuale per frame delle impostazioni di sensore, flash, obiettivo e post-elaborazione e acquisizione di immagini ad alta velocità.

I dispositivi LEVEL_3 supportano inoltre il ritrattamento YUV e l'acquisizione di immagini RAW, insieme a ulteriori configurazioni del flusso di output.

Se hai il livello di supprot LEGACY , dovresti usare la vecchia Camera Api .



0

Per favore leggi il link Supporto per la versione della fotocamera Dichiarano che ...
Camera API1
Android 5.0 obsoleto Camera API1, che continua ad essere gradualmente eliminato man mano che lo sviluppo della nuova piattaforma si concentra su Camera API2. Tuttavia, il periodo di eliminazione graduale sarà lungo e le versioni di Android continueranno a supportare le app Camera API1 per qualche tempo. In particolare, il supporto continua per:

  • Interfacce Camera1 API1 per app. Le app della fotocamera basate su Camera API1 dovrebbero funzionare come sui dispositivi che eseguono versioni di versioni di Android precedenti.
  • Versioni HAL della fotocamera. Include il supporto per Camera HAL1.0.

  • -1

    Ho scoperto che l'opzione migliore è creare due attività. Utilizzare il modo generale per verificare l'API del dispositivo corrente

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

    In questo modo non devo avere molta confusione quando guardo indietro al codice. Il codice è facile da modificare poiché separato.

    Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
    Licensed under cc by-sa 3.0 with attribution required.