Câmera Android
Neste artigo, vamos nos aprofundar no mundo da câmera Android e guiá-lo pelo processo de implementação da câmera em um aplicativo Android, incluindo hardware da câmera, API da câmera, intenções da câmera, permissões da câmera, configurações da câmera e melhores práticas para capturar alta fotos e vídeos de qualidade.
Se você possui um dispositivo Android , provavelmente está familiarizado com o aplicativo de câmera integrado que o acompanha. Este aplicativo permite que você tire fotos e grave vídeos com facilidade. No entanto, como desenvolvedor de aplicativos, você pode querer adicionar a funcionalidade de câmera personalizada ao seu aplicativo.
É aqui que a API da câmera do Android é útil. Com a API da câmera, você pode acessar o hardware da câmera do dispositivo e capturar fotos ou vídeos diretamente do seu aplicativo.
Compreendendo o hardware da câmera
Antes de mergulhar na API da câmera, é essencial entender o hardware da câmera em um dispositivo Android.
Os dispositivos Android normalmente têm dois tipos de câmeras:
- A câmera traseira (também conhecida como câmera principal).
- A câmera frontal (também conhecida como câmera selfie ou câmera secundária).
Essas câmeras podem ter especificações diferentes, como resolução, abertura, distância focal e suporte a flash, o que pode impactar na qualidade das imagens ou vídeos capturados.
Usando a API da câmera
A Camera API é um conjunto de classes e interfaces fornecidas pelo Android para interagir com o hardware da câmera e capturar imagens ou vídeos. A API da câmera permite controlar vários aspectos da câmera, como definir os parâmetros da câmera, visualizar a saída da câmera, capturar imagens ou vídeos e manipular eventos da câmera.
Aqui estão alguns dos métodos de API da câmera comumente usados no Android:
Métodos | Visão geral |
open(int cameraId) | Este método abre uma conexão com a câmera com o ID fornecido. A ID da câmera pode ser 0 para câmera traseira, 1 para câmera frontal ou qualquer outro valor se houver mais de duas câmeras no dispositivo. |
setPreviewDisplay(suporte de SurfaceHolder) | Este método define o SurfaceHolder a ser usado para exibir a visualização da câmera ao vivo. |
startPreview() | Este método inicia a visualização da câmera ao vivo. |
stopPreview() | Este método interrompe a visualização da câmera ao vivo. |
setPreviewCallback(Retorno de chamada PreviewCallback) | Esse método define um retorno de chamada a ser invocado para cada quadro de visualização, além de exibi-los na tela. |
takePicture (obturador ShutterCallback, PictureCallback raw, PictureCallback jpeg) | Este método captura uma imagem estática da câmera. O ShutterCallback é chamado quando a imagem está prestes a ser tirada, o PictureCallback é chamado quando os dados brutos da imagem estão disponíveis e o PictureCallback é chamado quando os dados da imagem compactada JPEG estão disponíveis. |
setParameters(Camera.Parameters params) | Este método define os parâmetros da câmera, como tamanho da imagem, modo de flash, modo de foco, etc. |
getParameters() | Este método retorna os parâmetros atuais da câmera. |
autoFocus(AutoFocusCallback cb) | Este método inicia uma operação de foco automático. O resultado da operação será retornado no AutoFocusCallback. |
cancelarAutoFoco() | Este método cancela a operação de foco automático atual. |
setErrorCallback(ErrorCallback cb) | Esse método define o retorno de chamada a ser invocado quando ocorre um erro. |
liberar() | Este método libera os recursos da câmera. Depois de chamar esse método, o objeto câmera não deve mais ser usado. |
Para usar a API da câmera em seu aplicativo Android, você precisa primeiro obter a permissão da câmera do usuário.
Definir permissões da câmera
A permissão da câmera é uma permissão confidencial e requer o consentimento explícito do usuário.
Você pode solicitar permissão de câmera usando o sistema de permissão do Android e lidar com retornos de chamada de permissão para garantir o tratamento adequado de permissão em seu aplicativo.
Depois de obter a permissão da câmera, você pode inicializar o hardware da câmera, definir os parâmetros da câmera e iniciar a visualização da câmera.
A visualização da câmera é um feed ao vivo da câmera que mostra o que a câmera está capturando em tempo real na tela do dispositivo.
Você também pode capturar imagens ou gravar vídeos usando a API da câmera e salvá-los no armazenamento do dispositivo ou processá-los em seu aplicativo.
Para usar a câmera em seu aplicativo, você precisa adicionar permissões ao manifesto do aplicativo.
Você precisará adicionar as seguintes permissões para a funcionalidade da câmera:
<uses-permission android:name="android.permission.CAMERA" /> <uses-feature android:name="android.hardware.camera" /> <uses-feature android:name="android.hardware.camera.autofocus" />
Adicionamos essas permissões ao nosso manifesto de aplicativo para habilitar a funcionalidade da câmera:
a primeira linha concede acesso à câmera do dispositivo e as próximas duas linhas confirmam que o dispositivo possui uma funcionalidade de câmera e foco automático.
Criar layout de visualização da câmera
Para exibir a saída da câmera na tela, você precisa criar um layout para a visualização da câmera em seu aplicativo.
Você pode criar um arquivo chamado “ camera_preview.xml ” e incluir o seguinte código:
<?xml version="1.0" encoding="utf-8"?> <SurfaceView android:id="@+id/camera_preview" android:layout_width="match_parent" android:layout_height="match_parent" />
Nosso arquivo de layout chamado camera_preview.xml contém um SurfaceView , que usaremos para exibir a visualização da câmera.
Criar classe de visualização da câmera
Para manipular a visualização da câmera, você precisa criar uma classe chamada CameraPreview .
Aqui está um exemplo de implementação que você pode usar:
public class CameraPreview extends SurfaceView implements SurfaceHolder.Callback { private SurfaceHolder mHolder; private Camera mCamera; public CameraPreview(Context context, Camera camera) { super(context); mCamera = camera; mHolder = getHolder(); mHolder.addCallback(this); mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); } @Override public void surfaceCreated(SurfaceHolder holder) { try { mCamera.setPreviewDisplay(holder); mCamera.startPreview(); } catch (IOException e) { Log.d("CameraPreview", "Error setting camera preview: " + e.getMessage()); } } @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { if (mHolder.getSurface() == null) { return; } try { mCamera.stopPreview(); } catch (Exception e) { Log.d("CameraPreview", "Error stopping camera preview: " + e.getMessage()); } try { mCamera.setPreviewDisplay(mHolder); mCamera.startPreview(); } catch (Exception e) { Log.d("CameraPreview", "Error starting camera preview: " + e.getMessage()); } } @Override public void surfaceDestroyed(SurfaceHolder holder) { mCamera.stopPreview(); mCamera.release(); } }
Nós, como desenvolvedores, estendemos a classe SurfaceView e implementamos a interface SurfaceHolder.Callback para criar uma classe chamada CameraPreview . A classe CameraPreview contém um objeto Camera que nos permite controlar o hardware da câmera.
Dentro do construtor, obtemos o SurfaceHolder do SurfaceView e anexamos um retorno de chamada a ele. Também definimos o tipo de SurfaceHolder como SURFACE_TYPE_PUSH_BUFFERS para garantir que seja compatível com versões mais antigas do Android.
O método surfaceCreated() é chamado quando o SurfaceView é criado. Nesse método, definimos a visualização da câmera para exibição no SurfaceView.
O método surfaceChanged() é chamado quando o SurfaceView muda de tamanho ou formato. Usamos esse método para interromper a visualização da câmera e reiniciá-la com os novos parâmetros.
Agora capture uma imagem
Uma vez configurada a visualização, você pode usar a instância da câmera para capturar uma imagem.
Aqui está um exemplo de como capturar uma imagem:
private Camera.PictureCallback mPicture = new Camera.PictureCallback() { @Override public void onPictureTaken(byte[] data, Camera camera) { // process the captured image data } };
Para capturar uma imagem, precisamos chamar o método takePicture da instância da câmera. Podemos definir um PictureCallback para processar os dados da imagem capturada.
O parâmetro data contém os dados brutos da imagem em uma matriz de bytes, que podemos processar no método onPictureTaken .
Aqui está um exemplo:
mCamera.takePicture(null, null, mPicture);
Passamos null para os dois primeiros parâmetros no código acima, pois não precisamos especificar nenhuma configuração para a imagem capturada. O terceiro parâmetro era a instância PictureCallback que seria chamada quando a imagem fosse capturada.
Lidando com Erros da Câmera
Para lidar com erros ao trabalhar com a câmera, é essencial conhecer os erros comuns que você pode encontrar.
Você pode se deparar com os seguintes erros:
Erros | Visão geral |
A câmera não está disponível | Esse erro ocorre quando outro aplicativo está usando a câmera ou quando a câmera não está disponível por algum outro motivo. |
A visualização da câmera não está disponível | Este erro ocorre quando a visualização da câmera não pode ser iniciada. |
O foco automático da câmera falhou | Este erro ocorre quando a câmera não consegue focar. |
Para lidar com esses erros, você pode implementar a interface Camera.ErrorCallback .
private Camera.ErrorCallback mErrorCallback = new Camera.ErrorCallback() { @Override public void onError(int error, Camera camera) { Log.e(TAG, "Camera error: " + error); } };
Para lidar com erros em nossa implementação de câmera, podemos definir uma interface ErrorCallback conforme mostrado no código anterior.
Essa interface registra a mensagem de erro no console. No entanto, você pode implementar sua própria lógica de tratamento de erros neste retorno de chamada conforme sua necessidade.
Para definir o retorno de chamada de erro, precisamos chamar o método setErrorCallback da instância da câmera da seguinte maneira:
mCamera.setErrorCallback(mErrorCallback);
Agora feche a câmera
Para liberar os recursos da câmera, você precisa chamar o método release() da instância Camera.
Este método liberará os recursos de hardware da câmera e os disponibilizará para outros aplicativos.
Aqui está um exemplo de como liberar a câmera em seu código:
private void releaseCamera() { if (mCamera != null) { mCamera.release(); mCamera = null; } }
Liberamos os recursos da câmera chamando o método release da instância da câmera no código acima.
Também definimos a instância da câmera como nula para garantir que ela seja liberada corretamente.
Vantagens da câmera Android
Usar a câmera em um aplicativo Android traz várias vantagens para você como usuário:
- Ao usar a câmera, os desenvolvedores podem criar experiências de usuário mais envolventes e envolventes para você. Você pode tirar fotos, gravar vídeos e usar recursos de realidade aumentada para tornar seu aplicativo mais divertido e interativo.
- Com a onipresença dos smartphones, você sempre tem uma câmera no bolso. Ao usar a câmera em seu aplicativo, você pode aproveitar essa conveniência e fornecer uma maneira fácil de capturar imagens e vídeos.
- A câmera pode ser usada para uma variedade de aplicações, desde escanear códigos de barras e documentos até reconhecer rostos e adicionar objetos virtuais ao mundo real. Essa versatilidade o torna uma ferramenta valiosa para muitos setores e aplicações.
- A API da câmera no Android é fácil de usar e acessível a desenvolvedores de todos os níveis. Isso torna mais fácil para os desenvolvedores incorporar a funcionalidade da câmera em seu aplicativo, independentemente do nível de experiência.
- A API da câmera no Android pode ser integrada a outras APIs e serviços, como serviços baseados em localização e armazenamento em nuvem. Essa integração permite ainda mais funcionalidade e flexibilidade em seu aplicativo.
- A câmera é uma tecnologia em constante evolução, com novos recursos e capacidades sendo adicionados o tempo todo. Ao incorporar a câmera em seu aplicativo, você pode aproveitar esses novos recursos e fornecer funcionalidades inovadoras e de ponta.
Melhores Práticas
Capturar fotos e vídeos de alta qualidade é essencial para garantir uma ótima experiência do usuário em seu aplicativo.
Aqui estão algumas práticas recomendadas a serem consideradas ao trabalhar com a câmera do Android:
- A visualização da câmera é o feed ao vivo da câmera que os usuários veem na tela. É importante otimizar a visualização da câmera para um desempenho suave e responsivo. Você pode usar técnicas como surfaceView, textureView e API camera2 para visualização eficiente da câmera.
- Os dispositivos Android podem ser usados em diferentes orientações, por isso é crucial lidar corretamente com a orientação da câmera em seu aplicativo. Você pode usar a orientação do sensor, a rotação da tela e a rotação da câmera para garantir que a mídia capturada seja exibida corretamente, independentemente da orientação do dispositivo.
- Os parâmetros da câmera, como modo de foco, modo de flash, compensação de exposição e balanço de branco, podem afetar bastante a qualidade da mídia capturada. Experimente diferentes parâmetros da câmera para obter os resultados desejados com base nas condições de iluminação e no assunto da foto ou do vídeo.
- A API da câmera do Android permite controlar a qualidade das imagens e vídeos capturados. Você pode definir o nível de compactação da imagem, taxa de bits de vídeo, resolução e taxa de quadros para otimizar a qualidade da mídia capturada em seu aplicativo.
- A câmera pode gerar vários eventos e erros, como foco automático, retorno de chamada do obturador e erros da câmera. É importante lidar com esses eventos e erros adequadamente em seu aplicativo para fornecer uma experiência de câmera suave e sem erros aos usuários.
- Imagens e vídeos capturados precisam ser armazenados adequadamente no armazenamento do dispositivo para garantir que estejam acessíveis e possam ser usados em seu aplicativo. Você pode usar práticas padrão de armazenamento de arquivos, como criar uma pasta dedicada para mídia, usar convenções adequadas de nomenclatura de arquivo e gerenciar o espaço de armazenamento com eficiência.
- Os dispositivos Android vêm em vários tamanhos, resoluções e recursos de câmera. É crucial testar minuciosamente a funcionalidade da câmera em diferentes dispositivos e orientações para garantir que ela funcione bem em diferentes dispositivos e tamanhos de tela.
Conclusão
Dominar a API Android Camera é essencial para criar aplicativos que exigem a funcionalidade da câmera. Ao seguir as práticas recomendadas, como otimizar a visualização da câmera, lidar com permissões e configurações da câmera, implementar controle de qualidade de imagem e vídeo e lidar com eventos e erros da câmera, você pode criar aplicativos que capturam fotos e vídeos de alta qualidade e fornecem uma experiência de câmera perfeita para seus usuários. Lembre-se de testar exaustivamente seu aplicativo em diferentes dispositivos e orientações para garantir que funcione bem em vários dispositivos Android . Boa captura!