Problema al colocar una foto en un ImageView desde cámara o galería

1,327 views
Skip to first unread message

Jefferson Delgado P.

unread,
Nov 13, 2013, 10:38:04 AM11/13/13
to desarrollad...@googlegroups.com
Buenas a todos,

Estoy teniendo un problema bastante curioso, a la hora de querer colocar una imagen, ya sea cogida de la galería, o bien sacada con la cámara de foto.
En el tiempo que transcurre, entre que selecciono la foto o la saco, y me la muestra en el imageView, la aplicación "sale" de si misma, para en este caso, mostrarme el menu de mi móvil (desde donde ejecuté la aplicación) Pasado este tiempo, me muestra la pantalla de mi aplicación, con la imagen muy bien puesta.

La llamada a sacar la foto, ya sea de cámara o de galería, la hago del siguiente modo:

//Hacer foto
hacerFoto.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View arg0) {
Intent camera_intent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
        startActivityForResult(camera_intent, SACAR_FOTO);     
}
});

//Sacar foto de galería
subirFoto.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View arg0) {
hacerFoto.setBackgroundResource(R.drawable.hacer_foto_off);
subirFoto.setBackgroundResource(R.drawable.subir_foto_on);
Intent i = new Intent(Intent.ACTION_PICK,android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
                startActivityForResult(i, FOTO_GALLERY);
}
});

En el onActivityResult, trato cada caso, para comprimirlas, pasarlas a bitmap, etc etc.

Decir, que este código está dentro de una clase Fragment (aunque dudo que eso influya)

Que tarde varios segundos, lo puedo entender debido a las operaciones que hago con las imágenes y demás, pero que salga al escritorio..pues no creo que sea lo más viable, ya que da la sensación de que la aplicación hizo crash.

¿Hay algún modo de evitar que salga al escritorio o de al menos, mostrar otra pantalla de "cargando" o lo que sea, mientras hace el proceso?


Muchas gracias.


Un saludo!


Gabriel Pozo

unread,
Nov 13, 2013, 11:11:14 AM11/13/13
to desarrollad...@googlegroups.com
Probablemente sea como comentas, demasiado trabajo. Seguramente lo debes estar realizando en el hilo principal y cuando este se bloquea por un tiempo se rompe porque la aplicación no responde (no recuerdo el tiempo exacto creo que son 5 segundos). Podrías realizar esas tareas en una AsyncTask ;)

Igualmente eso lo estoy suponiendo, porque al no ver la salida del logcat no se realmente cual es el error y que esta sucediendo con la misma :D


--
Para participar es necesario que leas detenidamente las normas del grupo: http://goo.gl/20KhL
---
Has recibido este mensaje porque estás suscrito al grupo "desarrolladores-android" de Grupos de Google.
Para anular la suscripción a este grupo y dejar de recibir sus correos electrónicos, envía un correo electrónico a desarrolladores-a...@googlegroups.com.
Para publicar una entrada en este grupo, envía un correo electrónico a desarrollad...@googlegroups.com.
Visita este grupo en http://groups.google.com/group/desarrolladores-android.
Para ver este debate en la Web, visita https://groups.google.com/d/msgid/desarrolladores-android/94c1f83b-6cf4-4498-b159-12c8ec819c83%40googlegroups.com.
Para obtener más opciones, visita https://groups.google.com/groups/opt_out.



--
Saludos, Gabriel

http://aprendiendodeandroidymas.com/

Jefferson Delgado P.

unread,
Nov 13, 2013, 11:16:37 AM11/13/13
to desarrollad...@googlegroups.com
Buenas Gabriel,

Si te digo la verdad, no me ha dado por mirar el logcat cuando ocurre eso..:$

Ostia! Buena idea eso de meter el tema de la llamada a la imagen en un Asyntask..no lo había pensado! Tendré que mirar si es posible meter un OnActivityResult en un Asyntask..que seguro que si! jeje

Muchas gracias nuevamente. Ya te contaré qué tal me va.


Un saludo!


Jefferson Delgado P.

unread,
Nov 14, 2013, 4:41:14 AM11/14/13
to desarrollad...@googlegroups.com
Buenas!


Que adaptándolo un poco a mis necesidades, me ha funcionado perfectamente.


Un saludo!!

Gabriel Pozo

unread,
Nov 14, 2013, 7:34:17 AM11/14/13
to desarrollad...@googlegroups.com
Gracias por poner tu solución :D claro ahí el objeto LoadImagesFromSDCard es una AsyncTask, y realiza el trabajo de escalar la misma para no para el hilo principal con ese procesamiento ;)



Para obtener más opciones, visita https://groups.google.com/groups/opt_out.

Jefferson Delgado P.

unread,
Jan 2, 2014, 11:59:46 AM1/2/14
to desarrollad...@googlegroups.com
Buenas nuevamente a todos,

Vuelvo a la carga con un problema, bastante extraño, ya que no me sucede en la Samsung Galaxy Tab 2, tanto de 7 como de 10 pulgadas, pero si me sucede en la Samsung Galaxy Tab 3.

El asunto es el siguiente: si saco una foto en horizontal, me la coloca en el ImageView sin ningún problema, pero si la saco en vertical, la guarda bien pero NO me la muestra en el ImageView. Si guardo, salgo de la pantalla y vuelvo a entrar, SI me muestra el ImageView con la foto que saqué previamente.

¿Alguna idea de qué puede estar ocurriendo? Si necesitan código, lo pongo sin ningún problema. Estos de Samsung van a acabar conmigo :(


Muchas gracias.


Un saludo!

Gabriel Pozo

unread,
Jan 2, 2014, 12:33:53 PM1/2/14
to desarrollad...@googlegroups.com
Por las dudas pone algo de código y la salida del logcat en ese momento ;)

Ya que estamos, llamas a algún método del tipo invalidate, o refresh state?


--
Para participar es necesario que leas detenidamente las normas del grupo: http://goo.gl/20KhL
---
Has recibido este mensaje porque estás suscrito al grupo "desarrolladores-android" de Grupos de Google.
Para anular la suscripción a este grupo y dejar de recibir sus correos electrónicos, envía un correo electrónico a desarrolladores-a...@googlegroups.com.
Para publicar una entrada en este grupo, envía un correo electrónico a desarrollad...@googlegroups.com.
Visita este grupo en http://groups.google.com/group/desarrolladores-android.

Para obtener más opciones, visita https://groups.google.com/groups/opt_out.

Jefferson Delgado P.

unread,
Jan 2, 2014, 1:09:56 PM1/2/14
to desarrollad...@googlegroups.com
Gracias Gabriel por responder,

La salida del logcat no muestra gran cosa la verdad, desde el momento en que le doy a guardar:

01-02 18:05:01.802: D/dalvikvm(12984): GC_FOR_ALLOC freed 2286K, 33% free 9979K/14732K, paused 10ms, total 10ms
01-02 18:05:01.812: I/dalvikvm-heap(12984): Grow heap (frag case) to 17.156MB for 6291472-byte allocation
01-02 18:05:01.822: D/dalvikvm(12984): GC_FOR_ALLOC freed 35K, 23% free 16087K/20880K, paused 7ms, total 7ms
01-02 18:05:01.822: D/AbsListView(12984): [unregisterDoubleTapMotionListener]
01-02 18:05:01.822: I/MotionRecognitionManager(12984):   .unregisterListener : / listener count = 0->0,  
01-02 18:05:01.822: D/AbsListView(12984): unregisterIRListener() is called 
01-02 18:05:01.842: D/dalvikvm(12984): GC_CONCURRENT freed 174K, 24% free 15931K/20880K, paused 2ms+2ms, total 20ms
01-02 18:05:02.162: D/dalvikvm(12984): GC_FOR_ALLOC freed 201K, 23% free 16096K/20880K, paused 7ms, total 7ms
01-02 18:05:02.172: I/dalvikvm-heap(12984): Grow heap (frag case) to 23.129MB for 6291472-byte allocation
01-02 18:05:02.182: D/dalvikvm(12984): GC_FOR_ALLOC freed 151K, 19% free 22089K/27028K, paused 7ms, total 7ms
01-02 18:05:02.202: D/dalvikvm(12984): GC_CONCURRENT freed 6K, 19% free 22095K/27028K, paused 2ms+3ms, total 15ms
01-02 18:05:02.712: E/ViewRootImpl(12984): sendUserActionEvent() mView == null
01-02 18:05:03.052: E/ViewRootImpl(12984): sendUserActionEvent() mView == null
01-02 18:05:03.272: D/dalvikvm(12984): GC_FOR_ALLOC freed 8831K, 35% free 19546K/29824K, paused 14ms, total 14ms


El código, es el que ya puse en las respuestas anteriores, pero la pongo nuevamente:

Llamada a la cámara:

sacarFoto.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
AlertDialog.Builder getImageFrom = new AlertDialog.Builder(Tree_detail.this);
       getImageFrom.setTitle("Seleccionar");
       final CharSequence[] opsChars = {"Cámara", "Galería", "Cancelar"};
       getImageFrom.setItems(opsChars, new android.content.DialogInterface.OnClickListener(){
           @Override
           public void onClick(DialogInterface dialog, int id) {
               if(id == 0){
                try {
                dateCameraIntentStarted = new Date();
                Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
               //NOTE: Do NOT SET: intent.putExtra(MediaStore.EXTRA_OUTPUT, cameraPicUri) on Samsung Galaxy S2/S3/.. for the following reasons:
               // 1.) it will break the correct picture orientation
               // 2.) the photo will be stored in two locations (the given path and additionally in the MediaStore)
               String manufacturer = android.os.Build.MANUFACTURER.toLowerCase();
               if(!(manufacturer.contains("samsung")) && !(manufacturer.contains("sony")) && !(manufacturer.contains("lge"))) {
                   String filename = System.currentTimeMillis() + ".jpg";
                   ContentValues values = new ContentValues();
                   values.put(MediaStore.Images.Media.TITLE, filename);
                   cameraPicUri = getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);
                   intent.putExtra(MediaStore.EXTRA_OUTPUT, cameraPicUri);
               }
               startActivityForResult(intent, SACAR_FOTO);
            } catch (ActivityNotFoundException e) {
            }
               }else if(id == 1){
                    Intent i = new Intent(Intent.ACTION_PICK,android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
                       startActivityForResult(i, FOTO_GALLERY);
               }
               dialog.dismiss();
           }
       });
       AlertDialog alert = getImageFrom.create();
alert.show();
}
});


Asyntask que se encarga de tratar la foto:

public class LoadImagesFromCameraBug extends AsyncTask<Uri, Void, String> {

private Bitmap photo = null;
protected void onPreExecute() {
}

protected String doInBackground(Uri... uri) {

mBitmap = null;
try {
           photo = BitmapHelper.readBitmap(context, cameraPicUri);
           if (photo != null) {
            Matrix matrix = new Matrix();
            matrix.postRotate(rotateXDegrees);

               // RECREATE THE NEW BITMAP
            photo = Bitmap.createBitmap(photo, 0, 0, photo.getWidth(), photo.getHeight(),matrix, false);
               mBitmap =  photo;              
           } else {
           }
} catch (Exception e) {
}
Uri tempUri = getImageUri(photo);
return getRealPathFromURI(tempUri);
            
}
protected void onPostExecute(String result) {

if (mBitmap != null) {
datos.image = null;
datos.image = mBitmap;
foto.setImageBitmap(mBitmap);
cambios = true;
mBitmap = null;
}
Calendar c = Calendar.getInstance();
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd_HH-mm-ss-SSS");
String fecha = df.format(c.getTime());
datos.nombrefoto = fecha + ".jpg";
copyFile(result, datos.path + "/", datos.nombrefoto);
}
}

Es el mismo código que para fotos horizontales, y el mismo funciona para la Tab 2 tanto de 7 como de 10 pulgadas.

Espero que arroje algo de luz al asunto.


Un saludo!

El miércoles, 13 de noviembre de 2013 15:38:04 UTC, Jefferson Delgado P. escribió:

Gabriel Pozo

unread,
Jan 2, 2014, 1:36:12 PM1/2/14
to desarrollad...@googlegroups.com
foto es el ImageView? probaste llamando a .postInvalidate(), invalidate(), o refreshDrawableState()  Desde el hilo de la UI?

onProgressUpdate o publishProgress 

http://developer.android.com/reference/android/os/AsyncTask.html#publishProgress%28Progress...%29


--
Para participar es necesario que leas detenidamente las normas del grupo: http://goo.gl/20KhL
---
Has recibido este mensaje porque estás suscrito al grupo "desarrolladores-android" de Grupos de Google.
Para anular la suscripción a este grupo y dejar de recibir sus correos electrónicos, envía un correo electrónico a desarrolladores-a...@googlegroups.com.
Para publicar una entrada en este grupo, envía un correo electrónico a desarrollad...@googlegroups.com.
Visita este grupo en http://groups.google.com/group/desarrolladores-android.

Para obtener más opciones, visita https://groups.google.com/groups/opt_out.

Jefferson Delgado P.

unread,
Jan 2, 2014, 1:39:33 PM1/2/14
to desarrollad...@googlegroups.com
Si, foto es el ImageView donde quiero colocar la foto que saqué.

No, la verdad que desconozco esos métodos. Les echaré un ojo a ver si los entiendo y te digo.

Muchas gracias.


Un saludo!


Jefferson Delgado P.

unread,
Jan 2, 2014, 1:56:15 PM1/2/14
to desarrollad...@googlegroups.com
Buenas Gabriel,

Según he leído, postInvalidate() es para hacerlo en el hilo no principal, mientras que los otros dos si.
He probado a usar tanto foto.invalidate() como foto.refreshDrawableState() después de asignarle a foto el bitmap, dentro del PostExecute(), y no he conseguido variar el resultado.

Con respecto al onProgressUpdate o onPublishProgress, no estoy muy seguro de cómo encajar algunas de esas llamadas en el proceso de sacar la foto y colocar el bitmap en el ImageView :(

Muchas gracias.


Un saludo

Gabriel Pozo

unread,
Jan 2, 2014, 2:19:29 PM1/2/14
to desarrollad...@googlegroups.com
Sobre escribí el onProgressUpdate para que actualice el ImageView, y llama a publishProgress dentro de la AsyncTask, como si se tratara de una barra de progreso.
http://stackoverflow.com/a/13982795/1748764



Para obtener más opciones, visita https://groups.google.com/groups/opt_out.

Gabriel Pozo

unread,
Jan 2, 2014, 2:21:09 PM1/2/14
to desarrollad...@googlegroups.com

Jefferson Delgado P.

unread,
Jan 2, 2014, 2:43:02 PM1/2/14
to desarrollad...@googlegroups.com
Buenas nuevamente,

Probé a cambiar, tal y como me indicaste, del siguiente modo:

protected String doInBackground(Uri... uri) {

mBitmap = null;
try {
           photo = BitmapHelper.readBitmap(context, cameraPicUri);
           if (photo != null) {
            Matrix matrix = new Matrix();
            matrix.postRotate(rotateXDegrees);

               // RECREATE THE NEW BITMAP
            photo = Bitmap.createBitmap(photo, 0, 0, photo.getWidth(), photo.getHeight(),matrix, false);
               mBitmap =  photo;              
           } else {
           }
} catch (Exception e) {
}
for (int i = 0; i < 100; i++) {

       try {
           Thread.sleep(25);
       } catch (InterruptedException e) {
           e.printStackTrace();
       }

       publishProgress(0);

   }
Uri tempUri = getImageUri(photo);
return getRealPathFromURI(tempUri);
            
}
protected void onProgressUpdate(Integer... values) {
   if (values[0] == 0) {
       foto.setImageBitmap(mBitmap);
       foto.invalidate();
   }
}
protected void onPostExecute(String result) {

if (mBitmap != null) {
datos.image = null;
datos.image = mBitmap;
cambios = true;
mBitmap = null;
}
Calendar c = Calendar.getInstance();
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd_HH-mm-ss-SSS");
String fecha = df.format(c.getTime());
datos.nombrefoto = fecha + ".jpg";
copyFile(result, datos.path + "/", datos.nombrefoto);
}

Y consigo el mismo resultado :(
Foto horizontal, lo hace incluso más rápido que antes (supongo porque asigno el bitmap en el propio doInBakGround), pero en vertical me sigue sin mostrar la imagen en el ImageView. En cambio se guarda, y si salgo y entro, está la imagen actualizada como si nada :\


Gracias nuevamente por el esfuerzo.


Gabriel Pozo

unread,
Jan 10, 2014, 8:17:48 AM1/10/14
to desarrollad...@googlegroups.com
>>>> Vuelvo a la carga con un problema, bastante extraño, ya que no me sucede en la Samsung Galaxy Tab 2, tanto de 7 como de 10 pulgadas, pero si me sucede en la Samsung Galaxy Tab 3.

Pregunta, porque se me ocurrió ahora, las calidades de pantalla o sea los DPI, y la calidad de la cámara son iguales? Y si re-dimensionas la imagen?
Porque en la AsyncTask si no veo mal, solo la rotas si es necesario, pero no tocas las dimensiones o si?



Para obtener más opciones, visita https://groups.google.com/groups/opt_out.

Jefferson Delgado P.

unread,
Jan 10, 2014, 8:57:33 AM1/10/14
to desarrollad...@googlegroups.com
Buenas Gabriel,

Como comentas, solo la roto, no modifico el tamaño de la imagen.
Pues ahora mismo desconozco esos datos que me estás preguntando, pero sea como fuere, es bastante extraño que no me la previsualize, pero si me la coloque cuando la cargo desde la sd, esa misma foto.

Finalmente, hablando con el jefe de proyecto y demás, decidimos permitir solo sacar fotos en horizontal desde la cámara, por lo que si se saca en vertical, no realiza ninguna acción (previo aviso al usuario).

No sé nos ocurrió otra solución y como teniamos fecha entrega el 6 enero, pues fue lo que hicimos.

Muchas gracias por responder.


Un saludo


Para participar es necesario que leas detenidamente las normas del grupo: http://goo.gl/8h8ez2

---
Has recibido este mensaje porque estás suscrito al grupo "desarrolladores-android" de Grupos de Google.
Para anular la suscripción a este grupo y dejar de recibir sus correos electrónicos, envía un correo electrónico a desarrolladores-a...@googlegroups.com.
Para publicar una entrada en este grupo, envía un correo electrónico a desarrollad...@googlegroups.com.
Visita este grupo en http://groups.google.com/group/desarrolladores-android.

Gabriel Pozo

unread,
Jan 10, 2014, 9:06:49 AM1/10/14
to desarrollad...@googlegroups.com
Ahora me dejaste con la intriga :D cuando tomas la foto de la galería te la devuelve con el mismo tamaño que con el que la tomaste?
Realmente no trabaje casi nada con la cámara, pero a lo mejor con algo como esto se solucionaba :D Lamentablemente llegué tarde :D



Para obtener más opciones, visita https://groups.google.com/groups/opt_out.
Reply all
Reply to author
Forward
0 new messages