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