Neste capítulo discutimos o acesso a arquivos armazenados no device e utilização da câmera do celular. Itens discutidos:
1. Carregar imagens armazenadas no device com Bitmap, BitmapFactory, decodeFile e createScaleBitMap.
2. Chamada à camêra usando uma Intent implícita;
3. Iniciar uma Intent e aguardar o seu resultado;
4. Método startActivityForResult()
2. Instrutor
●
Programador desde 2000
●
Aluno de doutorado
●
●
●
●
Mestre em informática pelo
ICOMP/UFAM
Especialista em aplicações
WEB – FUCAPI
marcio.palheta@gmail.com
sites.google.com/site/marcio
palheta
M.Sc. Márcio Palheta
3. Agenda
●
Arquivos
●
Usar Intent implícita da Câmera do Device
●
Passagem de parâmetros para a Câmera
●
Captura de imagens da câmera
●
Recuperar resultados de uma Activity
●
Carregar imagens de arquivos salvos no device
●
A imagem é perdida quando giramos a tela. E agora?
M.Sc. Márcio Palheta
3/41
4. Agora queremos completar o cadastro
●
●
●
●
Para completar o cadastro do aluno, queremos usar a
câmera do device para capturar sua foto;
O arquivo .jpeg da foto ficará armazenado no device
No SQLite, guardaremos apenas o caminho para o
arquivo físico
Na hora de carregar a foto, pegamos o caminho
armazenado no SQLite, acessamos o device e
carregamos a imagem na tela.
M.Sc. Márcio Palheta
4/41
5. Android e o sistema de Arquivos
●
No Android, temos as classes tradicionais de arquivos:
–
●
FileInputStream e FileOutputStream;
A Activity tem métodos para gerar esses objetos:
–
FileInputStream stream = openFileInput("arquivo.txt");
●
E se você precisar trabalhar com memória externa?
●
File diretorio = Enviroment.getExternalStorageDirectory()
●
Devolve um diretório externo, provavelmente, um sdcard
M.Sc. Márcio Palheta
5/41
6. Câmera
●
●
●
O android nos oferece duas formas de manipular câmera,
assim como ocorreu com a Chamada Telefônica
Na 1a, podemos usar e controlar todo o ciclo de vida e
opções do uso da câmera, como, por exemplo, habilitar
flash e controlar a entrada de luz
Na 2a, podemos chamar uma Activity especialista no
tratamento da câmera. Essa Activity recebe como
parâmetro, o local para salvar a foto capturada.
●
Bom, acho uma boa optarmos pela 2a alternativa.
●
E vamos aos códigos...
M.Sc. Márcio Palheta
6/41
7. Exercício 01: Carregar jpeg com a foto
●
Crie o método FormularioHelper.carregarFoto()
M.Sc. Márcio Palheta
7/41
8. Exercício 01: Carregar jpeg com a foto
Crie o método
carregarFoto()
●
Crie o método FormularioHelper.carregarFoto()
M.Sc. Márcio Palheta
8/41
9. Exercício 01: Carregar jpeg com a foto
●
Converte um
Arquivo em um
Crie oJAVA
Objeto método
Crie o método
carregarFoto()
FormularioHelper.carregarFoto()
M.Sc. Márcio Palheta
9/41
10. Exercício 01: Carregar jpeg com a foto
●
Converte um
Arquivo em um
Crie oJAVA
Objeto método
Crie o método
carregarFoto()
FormularioHelper.carregarFoto()
Definição de uma
Imagem reduzida
M.Sc. Márcio Palheta
10/41
11. Exercício 01: Carregar jpeg com a foto
●
Converte um
Arquivo em um
Crie oJAVA
Objeto método
Crie o método
carregarFoto()
FormularioHelper.carregarFoto()
Definição de uma
Imagem reduzida
Atualiza o atributo
foto do Aluno
M.Sc. Márcio Palheta
11/41
12. Exercício 01: Carregar jpeg com a foto
●
Converte um
Arquivo em um
Crie oJAVA
Objeto método
Crie o método
carregarFoto()
FormularioHelper.carregarFoto()
Definição de uma
Imagem reduzida
Atualiza o atributo
foto do Aluno
Atualiza a imagem
na Tela
M.Sc. Márcio Palheta
12/41
14. Exercício 02: Altere o FormularioHelper
Carregar a foto
do Aluno
M.Sc. Márcio Palheta
14/41
15. Exercício 02: Altere o FormularioHelper
Carregar a foto
do Aluno
Crie o método
getFoto()
M.Sc. Márcio Palheta
15/41
16. Hora de chamar a câmera
●
Para acessar a câmera, vamos seguir a estratégia de
chamar uma Intent implícita, especialista em câmera:
Intent irParaCamera = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
●
Podemos informar o local para salvar a foto:
irParaCamera.putExtra(MediaStore.EXTRA_OUTPUT, localFoto);
●
●
E esperar o retorno, com nome do arquivo gerado.
Para isso, informamos um código para a requisição
(requestCode), comumente associado a uma constante:
startActivityForResult(irParaCamera, FAZER_FOTO);
M.Sc. Márcio Palheta
16/41
17. Hora de chamar a câmera (continuação)
●
O retorno do método startActivityForResult()
vem no callback method onActivityResult()
@Override
protected void onActivityResult(
int requestCode, int resultCode, Intent data) { … }
●
O requestCode == FAZER_FOTO
●
Já o resultCode pode ser:
–
RESULT_OK: ocorreu tudo bem. :-)
–
RESULT_CANCELED: em caso de problemas
ou cancelamento :-(
M.Sc. Márcio Palheta
17/41
18. Exercício 03: Mudanças no Formulário
●
Na classe FormularioActivity, inclua novos atributos para
lidar com a câmera:
M.Sc. Márcio Palheta
18/41
19. Exercício 03: Mudanças no Formulário
●
Na classe FormularioActivity, inclua novos atributos para
lidar com a câmera:
M.Sc. Márcio Palheta
19/41
20. Exercício 04: Click da Imagem
●
No método FormularioActivity.onCreate(), implemente o
click da foto:
M.Sc. Márcio Palheta
20/41
21. Exercício 04: Click da Imagem
●
No método FormularioActivity.onCreate(), implemente o
click da foto:
Controle do click
da Foto do Aluno
M.Sc. Márcio Palheta
21/41
22. Exercício 04: Click da Imagem
●
No método FormularioActivity.onCreate(), implemente o
click da foto:
Controle do click
da Foto do Aluno
Devolve o
ImageView da foto
M.Sc. Márcio Palheta
22/41
23. Exercício 04: Click da Imagem
●
No método FormularioActivity.onCreate(), implemente o
click da foto:
Controle do click
da Foto do Aluno
Devolve o
ImageView da foto
M.Sc. Márcio Palheta
23/41
24. Exercício 04: Click da Imagem
●
No método FormularioActivity.onCreate(), implemente o
click da foto:
M.Sc. Márcio Palheta
24/41
25. Exercício 04: Click da Imagem
●
No método FormularioActivity.onCreate(), implemente o
click da foto:
Local em que a Foto
será armazenada
M.Sc. Márcio Palheta
25/41
26. Exercício 04: Click da Imagem
●
No método FormularioActivity.onCreate(), implemente o
click da foto:
Local em que a Foto
será armazenada
Referência para o
Local de armazenamento
M.Sc. Márcio Palheta
26/41
27. Exercício 04: Click da Imagem
●
No método FormularioActivity.onCreate(), implemente o
click da foto:
Local em que a Foto
será armazenada
Referência para o
Local de armazenamento
Intent Implícita para
uso da câmera
M.Sc. Márcio Palheta
27/41
28. Exercício 04: Click da Imagem
●
No método FormularioActivity.onCreate(), implemente o
click da foto:
Chamando a
Câmera
M.Sc. Márcio Palheta
28/41
29. Exercício 04: Click da Imagem
●
No método FormularioActivity.onCreate(), implemente o
click da foto:
Parâmetro: local de
armazenamento
Chamando a
Câmera
M.Sc. Márcio Palheta
29/41
30. Exercício 04: Click da Imagem
●
No método FormularioActivity.onCreate(), implemente o
click da foto:
Inicia a Activity da Câmera.
A resposta é lançada
no método de Callback
onActivityResult()
Parâmetro: local de
armazenamento
Chamando a
Câmera
M.Sc. Márcio Palheta
30/41
31. Exercício 04: Click da Imagem
●
No método FormularioActivity.onCreate(), implemente o
click da foto:
Inicia a Activity da Câmera.
A resposta é lançada
no método de Callback
onActivityResult()
Parâmetro: local de
armazenamento
Código da requisição
M.Sc. Márcio Palheta
(requestCode)
Chamando a
Câmera
31/41
32. Exercício 05: Verificação do resultado
●
Na ForumlarioActivity, crie o método onActivityResult(),
para verificar o resultado retornado pela Intent da Câmera:
M.Sc. Márcio Palheta
32/41
33. Exercício 05: Verificação do resultado
●
Na ForumlarioActivity, crie o método onActivityResult(),
para verificar o resultado retornado pela Intent da Câmera:
Tratamento da resposta
da Intent da câmera
M.Sc. Márcio Palheta
33/41
38. Desafio
●
Quando cadastramos um aluno, o formulário está vazio;
●
Se você clicar na foto, a câmera é chamada;
●
A foto é salva no device;
●
E exibida na tela de formulário;
●
Porém, se girarmos a tela, o que acontece?
●
Isso mesmo, a foto é perdida.
●
Resolva esse problema, recorrente em Android Apps
●
Ideia fantástica: acho que você pode usar o Bundle.
●
Só acho :-)
M.Sc. Márcio Palheta
38/41
39. O que vem a seguir?
●
LayoutInflater
●
Serviços de background: Receber SMS e Tocar MP3
●
Integração via JSON
●
Tarefas assíncronas e Barra de progresso
●
Fragments
●
Google Maps e GPS
M.Sc. Márcio Palheta
39/41