Como usar a câmera ou a API camera2 do Android para oferecer suporte a versões antigas e novas da API sem notas de depreciação?

135

A nova API camera2 me confunde. Quero desenvolver um aplicativo (para APIs do Android 10 - 21) que use a câmera do dispositivo. Conforme declarado aqui , devo usar a API "Câmera".

No entanto, quando tento adicionar a API "Câmera" (android.hardware.Camera) aos recursos de usuário do manifesto, ela é marcada como obsoleta . Por outro lado, não posso alterá-lo para a API "camera2" (android.hardware.camera2), pois é compatível apenas com a API Android 21+ (Android 5 - Lollipop) - também o vincularia, mas só posso adicionar 2 links.

Não só quero que meu aplicativo seja executado em versões mais antigas do Android, mas também a mais nova ...

Gee
fonte

Respostas:

152

Embora a API da câmera antiga esteja marcada como obsoleta, ela ainda está totalmente funcional e permanecerá assim por um bom tempo (como quase todos os aplicativos que usam câmera na Play Store o usam atualmente).

Você terá que ignorar as reclamações do Android Studio sobre a obsolescência, mas se você quiser oferecer suporte a versões do Android anteriores a 21, precisará usar a API antiga.

No nível 21 da API, você certamente pode usar a nova API e seus novos recursos, mas atualmente precisará manter um fluxo totalmente separado em seu aplicativo se alternar entre as APIs. Infelizmente, as duas APIs têm uma visão de mundo diferente o suficiente, é difícil escrever uma biblioteca de suporte que também permita que você use algo como a nova API em dispositivos mais antigos (onde a biblioteca mapeia da nova API para a API antiga, se não houver). na API 21 ou superior).

Eddy Talvala
fonte
1
Boa resposta. Então, se você deseja oferecer suporte à API de nível 16 ou superior, é melhor manter a câmera antiga por enquanto, certo?
Loolooii
5
então a única maneira é usar if e android.os.Build.VERSION.SDK_INT para separar o código?
hadi
Portanto, para um desenvolvedor, se você estiver segmentando apenas a API 21 e posterior, use o Camera2, mas se precisar de suporte herdado, use o Camera? Ou você recomendaria detectar versões de compilação e codificar 2 métodos diferentes usando as diferentes APIs?
john.weland
2
Depende do que seu aplicativo faz. Se a funcionalidade da câmera for direta, aponte e dispare e você deseja segmentar APIs antigas, basta usar a API da câmera antiga. Mas se você deseja fazer algo mais do que apenas pegar JPEGs e desenhar a pré-visualização, ou se você está apenas visando novas APIs, vá com camera2. No meio (difícil), existem aplicativos que desejam oferecer recursos opcionais sofisticados na câmera2, mas também funcionam em dispositivos antigos. Lá, você precisa criar dois caminhos de código separados, um para cada API.
Eddy Talvala
21
Descontinuar a API da câmera foi um erro, eles deveriam ter introduzido uma API avançada da câmera (para aplicativos avançados, como aplicativos de câmera completos) - caso contrário, a maioria dos aplicativos que usa a câmera apenas para tirar uma foto precisaria manter 2 apis. Google deve ter pelo menos introduziu uma biblioteca compacto (como sempre)
Sudara
38

Coloque todos os métodos da câmera necessários em uma interface e crie uma instância de câmera como esta

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

Dessa forma, você terá tudo dividido e isso facilitará sua vida.

Palavra de conselho - a vida com a camera2 não é tão boa assim. Os vendedores ainda fazem implementações ruins e, portanto, você terá que adicionar muitas condições e soluções alternativas.

Exemplo 1 - O S6 relata que não suporta flash :) Exemplo 2 - Um dispositivo LG reporta uma lista dos tamanhos de imagem suportados - no entanto, nem todos eles são realmente suportados !!

slott
fonte
14
Isso é verdade. Na verdade, a API da câmera 2 divide os dispositivos da câmera em três categorias: LEGADO, LIMITADO e CHEIO. Se a câmera for classificada como LEGACY, todas as chamadas de API da camera2 serão traduzidas para camera1 sob o capô, por isso realmente não vale a pena. Minha sugestão é ligar CameraCharacteristics characteristics = manager.getCameraCharacteristics(cameraID); if (characteristics.get(CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL) == CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL_LEGACY)... e escolher a API antiga, se for verdadeira.
panonski
9

Para dar suporte à API que você deseja, use o código abaixo. Apenas determine os nomes apropriados correspondentes aos níveis da API. Por exemplo, a API 21 é LOLLIPOP e a 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
 }
user0770
fonte
33
isso não é prático para uma implementação completa da câmera. além disso, agora você precisa manter dois caminhos de código. a verificação da versão tem seu uso no desenvolvimento do Android, mas não é isso.
Katzenhut
5
O que acontece se um usuário estiver executando o Build.VERSION_CODES.LOLLIPOP_MR1? Ou algo acima disso? Eu acho que sua segunda verificação deve ser "else if (Build.VERSION.SDK_INT> = Build.VERSION_CODES.LOLLIPOP)"
Ralph Pina
Queridos, como posso criar no mesmo apk camera2 e API antiga se meus aplicativos devem funcionar na API 16 e mais recente? Sabores é bom para este trabalho?
Mateus
Você precisa implementar as duas APIs. Basta manter uma interface e duas classes, onde a funcionalidade da câmera é implementada. Antes de criar uma das instâncias para executar a câmera, chame o método mencionado acima para descobrir qual classe e funcionalidade chamar
user0770
3

No entanto, o que o Google recomenda usar o Camera2 Api> = 21, mas você pode ter problemas com as configurações manuais.

Quando você precisar implementar o aplicativo para tirar uma foto com o Modo de configuração automática, ele funcionará bem. Mas! Se for necessário criar um aplicativo com a implementação do Modo de configuração manual, para dispositivos com API> = 21, verifique primeiro o NÍVEL DE HARDWARE suportado:

Selecione a câmera (frontal, frontal), obtenha as características e verifique o NÍVEL DE HARDWARE.

mCameraCharacteristics = mCameraManager.getCameraCharacteristics(mCameraId)

val level = mCameraCharacteristics.get(CameraCharacteristics.INFO_SUPPORTED_HARDWARE_LEVEL)

CameraCharacteristics representa os próximos níveis suportados: LIMITED, FULL, LEGACY, LEVEL_3, EXTERNAL.

Em um nível alto, os níveis são:

Os dispositivos LEGACY operam em um modo de compatibilidade com versões anteriores para dispositivos Android mais antigos e possuem recursos muito limitados.

Os dispositivos LIMITADOS representam o conjunto de recursos da linha de base e também podem incluir recursos adicionais que são subconjuntos de COMPLETO.

Os dispositivos COMPLETOS também oferecem suporte ao controle manual por quadro das configurações de sensor, flash, lente e pós-processamento e captura de imagem a uma taxa alta.

Os dispositivos LEVEL_3 também oferecem suporte ao reprocessamento YUV e captura de imagem RAW, além de configurações adicionais de fluxo de saída.

Se você obteve o nível de supressão LEGACY , use a Camera Api antiga .

Serj
fonte
1

Use a anotação de suporte

    @TargetApi(21)

para evitar checar

Prudhvi Raj Kumar
fonte
1
Então você não suporta os dispositivos Android antes dos 21!
Mina F. Beshay
0

Plz read link Suporte à versão da câmera Eles afirmam que ... O
Camera API1
Android 5.0 descontinuou o Camera API1, que continua a ser eliminado à medida que o desenvolvimento da nova plataforma se concentra no Camera API2. No entanto, o período de eliminação gradual será longo e as versões do Android continuarão a oferecer suporte aos aplicativos Camera API1 por algum tempo. Especificamente, o suporte continua para:

  • Interfaces API1 da câmera para aplicativos. Os aplicativos de câmera criados com base na API da câmera1 devem funcionar como nos dispositivos executando versões anteriores do Android.
  • Versões da câmera HAL. Inclui suporte para a câmera HAL1.0.
  • rajesh780
    fonte
    -1

    Eu descobri que a melhor opção é criar duas atividades. Use a maneira geral de verificar a API do dispositivo atual

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

    Dessa forma, não preciso ter muita confusão quando olhar para trás o código. O código é fácil de modificar, pois foi separado.

    teck wei
    fonte