How to save path from a photo taken from the camera in Path or String

4

I need to get the path that saved the image and save it so that whenever I start the app the image appears in an ImageView. My code is the one

 public void onClickCamera(View v){
    Intent cameraIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
    startActivityForResult(cameraIntent, CAMERA_REQUEST);
}

public void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == CAMERA_REQUEST && resultCode == RESULT_OK) {
        Bitmap photo = (Bitmap)data.getExtras().get("data");        
        imageView.setScaleType(ImageView.ScaleType.FIT_XY);
        imageView.setImageBitmap(photo);}}
    
asked by anonymous 09.05.2014 / 12:42

2 answers

4

One time I went through the same obstacle, searching for a bit I found a code in SOen that solved my problem and I believe it solves yours too:

protected void onActivityResult(int requestCode, int resultCode, Intent data) {  
    if (requestCode == CAMERA_REQUEST && resultCode == RESULT_OK) {
        Bitmap photo = (Bitmap) data.getExtras().get("data"); 
        imageView.setScaleType(ImageView.ScaleType.FIT_XY);
        imageView.setImageBitmap(photo);
        knop.setVisibility(Button.VISIBLE);


        // Chame este método pra obter a URI da imagem
        Uri uri = getImageUri(getApplicationContext(), photo);

        // Em seguida chame este método para obter o caminho do arquivo
        File file = new File(getRealPathFromURI(uri));

        System.out.println(file.getPath());
    }  
}

public Uri getImageUri(Context inContext, Bitmap inImage) {
    ByteArrayOutputStream bytes = new ByteArrayOutputStream();
    inImage.compress(Bitmap.CompressFormat.JPEG, 100, bytes);
    String path = Images.Media.insertImage(inContext.getContentResolver(), inImage, "Title", null);
    return Uri.parse(path);
}

public String getRealPathFromURI(Uri uri) {
    Cursor cursor = getContentResolver().query(uri, null, null, null, null); 
    cursor.moveToFirst(); 
    int idx = cursor.getColumnIndex(MediaStore.Images.ImageColumns.DATA); 
    return cursor.getString(idx); 
}
    
09.05.2014 / 13:30
1

@Guilherme did you run your code from a Samsung mobile phone? Because I do not know if they are in all but in some samsung cell phones a bug occurs saying data of method onActivityResult returns null. I'll show you how to get the URI of the photo that was just taken based on the code that google makes available in: Android Camera API Guide

/**
  * (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 did and I will be sharing with everyone. You can use this class at will. It has a very good image compression method if you want to save images to the database. In your onActivityResult method 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've used getActivity().getApplicationContext() because I'm getting the context from a Fragment, not an Activity. I believe that with this method you can have what you want. Just make the necessary changes as how to get context. How to get the TAG to display in logs etc.

    
09.05.2014 / 14:06