You are on page 1of 13

Capturando e visualizando imagens

Introduo
O objetivo deste projeto realizar captura de imagem com a cmera
do dispositivo, armazen-la no carto SD e, por fim, visualiz-la.
Neste exemplo, iremos requisitar ao prprio aplicativo da cmera para
que a foto seja capturada usando um Intent. Esta uma forma simples e
prtica de incluir esta funcionalidade no seu aplicativo.
As imagens capturadas devem ser armazenadas no carto de memria
para evitar que o espao de armazenamento interno no fique
comprometido.

Introduo
Por padro, existem dois diretrios que podemos utilizar para salvar as
imagens capturadas.
O getExternalStoragePublicDirectory, da classe Environment, que
retorna um diretrio compartilhado por todas as aplicaes e o
recomendado para o armazenamento de fotos e vdeos. Como este
diretrio no est associado ao aplicativo que gravou a imagem, quando
este desinstalado, os dados no so perdidos.
O outro diretrio que pode ser utilizado o obtido atravs de
Context.getExternalFilesDir, que retorna um diretrio associado ao
aplicativo.

Neste projeto iremos utilizar a primeira forma.

Aplicao de exemplo
Crie um novo projeto chamado ExemploCamera01 com um pacote
chamado pdm.exercicios.testes e marque a opo para criar a Activity
principal.

Na tela inicial, inclua dois botes para capturar e visualizar a imagem


salva. Quando clicado, o primeiro dever chamar o mtodo capturar e
o segundo dever chamar o mtodo visualizar.

Aplicao de exemplo
Abra o arquivo de cdigo da Activity. Declare uma varivel privada,
esttica, final, do tipo int chamada CAPTURAR_IMAGEM. Inicialize-a
com o valor 1.

Declare outra varivel privada do tipo Uri chamada arquivo.


Declare o mtodo pblico capturar (chamado pela Activity) e faa as
implementaes seguintes:
Declare uma varivel do tipo File chamada diretorio. Inicialize-a
com o seguinte valor:

Essa varivel receber o diretrio pblico do aparelho onde as imagens


gerais so salvas.

Aplicao de exemplo
Declare uma varivel do tipo String chamada nomeImagem e
inicialize-a com o seguinte valor:

Desta forma, o nome do arquivo ser sempre o horrio em que a


imagem foi capturada, evitando duplicidades.
Em seguida, faa com que a varivel arquivo receba um novo arquivo
criado no diretrio especificado.

Aplicao de exemplo
Declare uma varivel do tipo Intent chamada camera e inicialize-a
com uma nova Intent, passando como parmetro do construtor o valor
MediaStore.ACTION_IMAGE_CAPTURE.

Isso far com que a Intent criada abra o aplicativo de cmera do celular
para capturar imagens.
Na sequncia, execute o mtodo putExtra da varivel camera,
passando dois parmetros: MediaStore.EXTRA_OUTPUT e arquivo.
Isso far com que a Intent grave o arquivo de imagem capturado no
carto externo.

Aplicao de exemplo
Para terminar o mtodo capturar, execute o mtodo
startActivityForResult, passando dois parmetros: camera e
CAPTURAR_IMAGEM.

Este mtodo executa uma Activity e retorna um resultado para a classe


que a chamou. No caso, utilizamos a constante CAPTURAR_IMAGEM
com o objetivo de informar um cdigo para identificar a solicitao.
Quando o aplicativo da cmera tirar a foto e o usurio confirmar a
captura, a Activity da cmera ser finalizada com um resultado e o
mtodo onActivityResult da Activity principal ser invocado. Portanto,
precisamos codificar este mtodo.
Neste mtodo, faremos uma checagem para saber se o resultado
para a solicitao que foi feita com o cdigo CAPTURAR_IMAGEM.

Aplicao de exemplo
Crie um mtodo protegido sem retorno chamado onActivityResult que
espera trs parmetros: requestCode do tipo int, resultCode do
tipo int e data do tipo Intent.

Dentro do mtodo faa a seguinte codificao:

Este mtodo est verificando se o cdigo de requisio o de captura


de imagem e se o resultado da ao foi Ok. Caso seja, o mtodo
adicionarNaGaleria() chamado para salvar o arquivo na galeria de
imagens do celular.

Aplicao de exemplo
Crie um mtodo privado sem retorno chamado adicionarNaGaleria
que no espera a passagem de parmetros. Dentro dele, faa:
Declare uma Intent chamada galeria que recebe um novo objeto
da classe Intent passando como parmetro do construtor o valor
Intent.ACTION_MEDIA_SCANNER_SCAN_FILE.
Em seguida, execute o mtodo setData da varivel galeria,
passando como parmetro a varivel arquivo.
Por fim, execute o mtodo sendBroadcast da varivel this,
passando como parmetro a varivel galeria. Isso far com que o
aplicativo envie uma mensagem (broadcast) para o equipamento
efetivamente armazenar a imagem capturada no dispositivo.

Aplicao de exemplo
Crie o mtodo visualizar, o qual chamado diretamente pela
Activity. Lembre-se de passar um parmetro do tipo View.
Declare uma Intent chamada imagem e inicialize-a com um novo
objeto da classe Intent, passando como parmetro do construtor
Intent.ACTION_VIEW. Essa Intent apenas abrir o arquivo de imagem no
formato de visualizao.

Em seguida, execute o mtodo setDataAndType da varivel


imagem, passando dois parmetros: a varivel arquivo e a string
image/jpg. Assim estamos dizendo que a imagem est armazenada na
varivel arquivo e possui a extenso jpg.
Por fim, execute o mtodo startActivity, passando como parmetro a
varivel imagem.

Aplicao de exemplo
Infelizmente, o emulador padro do Eclipse gera erros no momento da
captura de imagens, mesmo utilizando-se a webcam do computador.
Neste caso, voc ter que testar o aplicativo diretamente em um
aparelho com Android.

Para isso, voc pode gerar um APK do aplicativo (opo Export) ou


conectar o seu celular no computador e us-lo diretamente como um
emulador virtual.

Exerccio avaliativo
Utilizando os conhecimentos adquiridos no projeto sobre
Notificaes, altere o projeto de captura de imagem para que uma
notificao seja gerada assim que a captura da imagem for confirmada.

Quando o usurio clicar na notificao, o aplicativo dever exibir a


imagem capturada anteriormente.

You might also like