quinta-feira, 7 de agosto de 2014

Acessando a câmera no Android













Acessar um hardware via programação nunca foi uma coisa muito simples em qualquer linguagem de programação. Confira nesse artigo a maneira mais fácil de acessar a câmera do Android e salvar fotos no cartão de memória do aparelho.


Criando o projeto


Crie um Android Application Project no seu eclipse.
No nosso caso, nomeamos o projeto como ExemploCamera.































Definindo as permissões


Coloque as permissões de acesso no seu arquivo manifest.





























Colocando um botão para abrir a câmera


Coloque um botão no seu layout para abrir a câmera.














Implementando tudo


Estamos utilizando a biblioteca Android Query. Caso você não a conheça confira esse artigo. http://blog.mobsource.com.br/2014/08/acessando-internet-e-previsao-do-tempo.html
Faça a implementação conforme demostrado abaixo.

package com.example.exemplocamera;

import java.io.File;
import java.util.Calendar;
import com.androidquery.AQuery;
import android.media.MediaScannerConnection;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.provider.MediaStore;
import android.view.View;
import android.widget.Toast;
import android.app.Activity;
import android.content.Intent;

public class MainActivity extends Activity {

private AQuery aq;
private String fileName;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

aq = new AQuery(this);
aq.id(R.id.button1).clicked(buttonPhotoClick());
}

private View.OnClickListener buttonPhotoClick() {
return new View.OnClickListener() {

@Override
public void onClick(View v) {
abrirCamera();
}
};
}

private void abrirCamera() {
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);

fileName = Long.toString(Calendar.getInstance().getTimeInMillis()) + ".png";
File f = new File(Environment.getExternalStorageDirectory() + File.separator + "myphoto" + 

                 File.separator + "photos" + File.separator + fileName);
File fDir = new File(Environment.getExternalStorageDirectory() + File.separator + "myphoto" + 
                 File.separator + "photos");

try {
fDir.mkdirs();
}
catch(Exception e) {
e.printStackTrace();
}

if (intent.resolveActivity(getPackageManager()) != null) {
intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(f));
startActivityForResult(intent, 666);
}

}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == 666) {
scanPhoto(Environment.getExternalStorageDirectory() + File.separator + "myphoto" + 
 File.separator + "photos" + File.separator + fileName);

Toast.makeText(getApplicationContext(), "Foto capturada com sucesso", Toast.LENGTH_LONG).show();
}
}

private void scanPhoto(String photo) {
MediaScannerConnection.scanFile(getApplicationContext(), new String[] { photo }, null, 
                       new MediaScannerConnection.OnScanCompletedListener() {                      
@Override
public void onScanCompleted(String path, Uri uri) {
// DO NOTHING                             
}
});
}
}


Ou ainda para facilitar a visualização.... (clique para ampliar)






































Explicando tudo


Capturamos o "clique" do botão e chamamos a função "abrirCamera".
Criamos uma intent que coloca a responsabilidade no sistema de abrir a câmera e tirar a foto. :)
Verificamos a existência dos diretórios no cartão de memória e definimos o nome do arquivo.
Iniciamos a activity informando que assim que ela finalizar, deverá retornar com o código 666. (sugestivo não acha ? rs)
Ao receber o resultado que a foto foi tirada no método "onActivityResult", informamos ao sistema através da função "scanPhoto" que a foto deverá ser adicionada na galeria do sistema.
Rode o aplicativo e faça um teste.
Abra a galeria de fotos e lá estará a foto que você acabou de tirar pelo aplicativo ! :)
Talvez você se pergunte :
-"E se eu quiser fazer um vídeo ao invés de tirar fotos ?"
Bom, aguardem o próximo artigo. :-P
Até lá !