sábado, 13 de abril de 2019

Android - Utilizando a câmera


Olá amigos do The Club, a partir deste mês começarei a redigir artigos práticos utilizando a ferramenta de desenvolvimento “Android Studio”. Recomendo a utilização desta IDE por se tratar da mais completa e atualizada quando o assunto se diz respeito aos dispositivos móveis com o Sistema Operacional Android. Um dos recursos mais usuais presentes nos disposivos móveis (tablets, celulares) é o uso da Câmera. Um exemplo quando desenvolvemos aplicativos, é a necessidade de fotografar um produto para mostrá-lo ao cliente. A partir disto, surgiu então a ideia de escrever este artigo, abordando todas as etapas para implementar este tipo de funcionalidade. Este primeiro irá criar a classe “Camera” junto com os lay-outs necessários apenas para a apresentação da Câmera dentro de uma “Activity”.
Estarei utilizando o “Android Studio 2.2.2” Build de Outubro de 2016 e o “Java 1.8.0_111”. Preparei o aplicativo para ser rodado a partir do Android 4.1. (Por se tratar de uma versão mais estável e muito utilizada entre nossos leitores)
Organizei o artigo da seguinte forma:
- Modificação do arquivo “AndroidManifest.xml”
- Criação do lay-out principal.
- Implementação da classe “CameraVisualizao”
- Implementação da atividade principal “MainActivity”.

Criando o Exemplo

Abra o Android Studio clicando em “File/New Project...” para a criação de um novo projeto. O primeiro passo seria atribuir um nome para a aplicação (Ex: AppCamera), um domínio (Ex: thiago.example.com), Nome do Pacote (Ex: com.example.thiago.appcamera) e Localização (Ex: C:\users\Thiago\AndroidStudioProjects\AppCamera). Fiquem a vontade para configurar o projeto da forma que desejar. Ver Figura 01.

Figura 01: Configurações Iniciais.
Na próxima tela definimos a versão da API do Android utilizada, ex: API 16 – Android 4.1 (Jelly Bean). No próximo passo conseguimos implementar algumas pré-configurações em nossa “Activity”. Costumo escolher a opção “Empty Activity”, q qual irá criar uma atividade vazia. Ver Imagem 02.

Figura 02: Criando a Activity.

Finalizamos a criação do projeto com o nome da Atividade principal. (Ex: MainActivity.java)

Modificação do arquivo “AndroidManifest.xml”

Deveremos adicionar duas linhas importantes neste arquivo responsáveis por permitir o uso e implementação da câmera no aplicativo.Ver listagem 01 com o código identificado.

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
   
package="com.example.thiago.appcamera" >

    <
uses-permission android:name="android.permission.CAMERA" />
    <
uses-feature android:name="android.hardware.camera" />

    <
application
       
android:allowBackup="true"
       
android:icon="@mipmap/ic_launcher"
       
android:label="@string/app_name"
       
android:supportsRtl="true"
       
android:theme="@style/AppTheme" >
        <
activity android:name=".MainActivity" >
            <
intent-filter>
                <
action android:name="android.intent.action.MAIN" />
                <
category android:name="android.intent.category.LAUNCHER" />
            </
intent-filter>
        </
activity>
    </
application>
</
manifest>
Listagem 01.

Criação do lay-out principal.

O nosso lay-out principal será composto por um “FrameLayout” e dentro do mesmo mais um “Framelayout” e um “ImageButton”. Assim teremos a câmera ocupando a tela toda da tela do dispositivo e com um pequeno botão (X) para fechar o aplicativo. Ver Imagem 03.

Figura 03: Lay-out proposto.

Implementação da classe “CameraVisualizao”

A classe supracitada será responsável por englobar todos os métodos principais para o funcionamento de nossa câmera. Primeiramente deveremos importar algumas bibliotecas essenciais para o bom funcionamento. Listagem 02.
import android.content.Context;

import android.hardware.Camera;

import android.util.Log;

import android.view.SurfaceHolder;

import android.view.SurfaceView;

import java.io.IOException;
public class CameraVisualizacao extends SurfaceView implements 
SurfaceHolder.Callback

{

Esta classe pública CameraVisualizacao irá herdar da “SurfaceView” e implementar da 
“SurfaceHolder.Callback” declarando os métodos: “SurfaceCreated”, “SurfaceChanged” e 
“SurfaceDestroyed”
    private SurfaceHolder mHolder;

    private Camera mCamera;



    public CameraVisualizacao(Context context, Camera camera)

    {

        super(context);

        mCamera = camera;

        mCamera.setDisplayOrientation(90);

        mHolder = getHolder();

        mHolder.addCallback(this);

        mHolder.setType(SurfaceHolder.SURFACE_TYPE_NORMAL);

    }
O método construtor irá receber dois parâmetros, sendo: O Contexto e o objeto Camera. 
Dentro do mesmo iremos setar algumas propriedades como por exemplo a orientação do visor
 (“setDisplayOrientation”).



    @Override

    public void surfaceCreated(SurfaceHolder surfaceHolder)

    {

        try

        {

            mCamera.setPreviewDisplay(surfaceHolder);

            mCamera.startPreview();

        }

        catch (IOException e) {

            Log.d("ERRO", "Problemas para criar o Preview da Câmera!" + 
e.getMessage());

        }

    }



No método sobrescrito “SurfaceCreated” iremos implementar um “try/catch” para definirmos a
superfície a ser utilizada para visualização (setPreviewDisplay) e o início da captura e desenho dos 
enquadramentos para a tela (startPreview).


    @Override

    public void surfaceChanged(SurfaceHolder surfaceHolder, int i, int i2, int i3)

    {

        if(mHolder.getSurface() == null) return;



        try

        {

            mCamera.stopPreview();

        } 

        catch (Exception e){

        }

        try

        {

            mCamera.setPreviewDisplay(mHolder);

            mCamera.startPreview();

        } catch (IOException e) {

            Log.d("ERRO", " Problemas para criar o Preview da Câmera!" 
            e.getMessage());

        }

    }

O método “SurfaceChanged” é chamado quando a superfície tem suas características alteradas. 
Assim podemos redefinir a superfície a ser utilizada para visualização.



    @Override

    public void surfaceDestroyed(SurfaceHolder surfaceHolder)

    {

        mCamera.stopPreview();

        mCamera.release();

    }

}

Listagem 02.
O método “SurfaceDestroyed” é invocado quando paramos a aplicação. Liberamos todos os objetos da memória.

Implementação da atividade principal “MainActivity”.

Esta Activity irá consumir a classe “Camera” e apresentá-la na tela de nosso aplicativo. Listagem 03.

import android.hardware.Camera;

import android.support.v7.app.AppCompatActivity;

import android.os.Bundle;

import android.util.Log;

import android.view.View;

import android.widget.FrameLayout;

import android.widget.ImageButton;



Deveremos importar algumas bibliotecas para esta tarefa.


public class MainActivity extends AppCompatActivity

{

    private Camera mCamera = null;

    private CameraVisualizacao mCameraView = null;



Para implementar todas as funcionalidades usaremos duas variáveis privadas.


    @Override

    protected void onCreate(Bundle savedInstanceState) 

    {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);



        try{

            mCamera = Camera.open();

           } catch (Exception e){

            Log.d("ERRO", "Falha ao obter a Câmera: " + e.getMessage());

        }



        if(mCamera != null) {

            mCameraView = new CameraVisualizacao(this, mCamera);             
            FrameLayout camera_view = (FrameLayout)findViewById(R.id.camera_view);

            camera_view.addView(mCameraView);        
 }



        ImageButton imgClose = (ImageButton)findViewById(R.id.imgClose);

        imgClose.setOnClickListener(new View.OnClickListener() {

            @Override

            public void onClick(View view) {

                System.exit(0);

            }

        });
 
 

    }

}
Listagem 03.

Todas as funcionalidades serão inseridas no método “OnCreate”. Através do método “Open” inicializamos a Câmera com o auxílio do “Try/Catch”. Instanciamos a classe “CameraVisualizacao” passando por parâmetro o Contexto e a variável “mCamera”. Por final alimentamos o nosso layout.
Não podemos esquecer da implementação do botão fechar, invocando o método “System.exit”.
Podemos conferir o aplicativo em funcionamento na imagem 04.

Figura 04: Apilcativo em funcionamento.

Conclusões

A ideia principal deste artigo foi apresentar as funcionalidades básicas para a implementação do uso da câmera em aplicativos para o sistema Android. Utilizei bibliotecas específicas, como por exemplo: a “Camera”, a “SurfaceHolder” e a “SurfaceView” e também realizei alterações importantes no arquivo “AndroidManifest”, a fim de chegar em um resultado esperado. Nos próximos artigos irei implementar outras funcionalidades com base no exemplo abordado neste mês.
Um grande abaraço e até o mês que vem.




Nenhum comentário:

Postar um comentário