@Guilherme you executed your code from a Samsung phone? Because I do not know if they are at all but on some mobiles Samsung occurs a bug saying that data
of the method onActivityResult
returns null. I will show you how to get the URI of the photo that has just been taken based on the code that google provides on: Android API Gui for Camera
/**
* (ISTO é uma variável de instância) Contem o caminho e o nome do arquivo onde desejamos salvar a imagem.
* Usado principalmente para iniciar uma Intent.Action_View com esta URI. (GalleryApp)
*/
private Uri uriImagem = null;
public void onClickCamera(View v){
// Cria uma intent para capturar uma imagem e retorna o controle para quem o chamou (NAO PRECISA DECLARAR PERMISSAO NO MANIFESTO PARA ACESSAR A CAMERA POIS O FAZEMOS VIA INTENT).
Intent intent = new Intent( MediaStore.ACTION_IMAGE_CAPTURE );
// Cria um arquivo para salvar a imagem.
uriImagem = ProcessaImagens.getOutputMediaFileUri( ProcessaImagens.MEDIA_TYPE_IMAGE, getActivity().getApplicationContext() );
// Passa para intent um objeto URI contendo o caminho e o nome do arquivo onde desejamos salvar a imagem. Pegaremos atraves do parametro data do metodo onActivityResult().
intent.putExtra( MediaStore.EXTRA_OUTPUT, uriImagem );
// Inicia a intent para captura de imagem e espera pelo resultado.
startActivityForResult( intent, CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE );
}
The class Image processing was a class I made and will be sharing with everyone. You can use this class at will. It has a very good image compression method in case you want to save images in the database. In your methodonActivityResult
do this:
@Override
public void onActivityResult( int requestCode, int resultCode, Intent data ) {
// Se finalizou a activity em startForActivityResult.
if ( resultCode == Activity.RESULT_OK ) {
if ( requestCode == CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE ) {
String imagemPath = uriImagem.getPath();
// Vou compactar a imagem, leia o javadoc do médoto e verá que ela retorna tanto um bitmap como um array de bytes.
List<Object> imagemCompactada = ProcessaImagens.compactarImagem( uriImagem.getPath() );
Bitmap imagemBitmap = (Bitmap) imagemCompactada.get( 0 );
byte[] imagemBytes = (byte[]) imagemCompactada.get( 1 );
}
}
// Se cancelou a activity em startForActivityResult.
else if ( resultCode == Activity.RESULT_CANCELED ) {
if ( requestCode == CAPTURE_IMAGE_ACTIVITY_REQUEST_CODE ) {
// Usuario cancelou a captura da imagem.
Log.d( getTag(), "Captura de imagem CANCELADA!" );
}
}
// Se ocorreu algum erro na activity em startForActivityResult.
else {
// Captura da imagem falhou, avisa ao usuario.
Toast.makeText( getActivity().getApplicationContext(), "FALHA! A captura da imagem falhou!", Toast.LENGTH_LONG ).show();
Log.e( getTag(), "FALHA! A captura da imagem falhou!" );
}
}
Note that I used getActivity().getApplicationContext()
because I am getting the context from a Fragment and not from an Activity. I believe that with this method you can get what you want. Just make the necessary changes as the way to get context. The way to get the TAG to display in logs etc.
I recommend taking a look at disk Storage. Here is a link with examples: http://developer.android.com/training/basics/data-storage/files.html
– Wakim