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.
![](andr1611-01.jpg)
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.
![](andr1611-02.jpg)
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.
![](andr1611-03.jpg)
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 aorientaçã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.
![](andr1611-04.jpg)
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. |
![](../../../images/autor/autores.png) |
|
Sobre o Autor
|
Thiago Cavalheiro Montebugnoli adora aprender novas tecnologias. Formado pela Faculdade de Tecnologia de Botucatu – SP (FATEC), já desenvolveu softwares utilizando a plataforma .NET, Delphi junto com Banco de Dados SQL Server e Firebird. Como experiências profissionais mais recentes, possui em seu currículo sua atuação no Centro de Processamento de Dados da Prefeitura Municipal de Itaí-SP e atualmente compõe a equipe da Coordenadoria Tecnologia da Informação no IFSP – Instituto Federal do Estado de São Paulo em Avaré. Além disso, é colunista mensal da Revista The Club Megazine e é consultor Técnico do The Club. Possui as seguintes certificações: MCP - Microsoft Certified Professional, MCTS - Microsoft Certified Technology Specialist, MCAD - Microsoft Certified Application Developer e MCSD - Microsoft Certified Solution Developer.
E-mail: suporte@theclub.com.br
|
|