Hola compadres:
Llevo unos meses desarrollando una aplicación en Java (Android) para una empresa. Una de las cosas que hace esta aplicación es tomar una serie de fotos desde la cámara del teléfono y comprimirlas para que ocupen mucho menos espacio y poder subirlas más rapidamente al servidor de la empresa.
Al poco de distribuir la aplicación muchos usuarios me llamaron comentando que el programa se cerraba de golpe al encontrar un fallo a la hora de guardar las imágenes, por lo que los datos sin guardar que hubiera se perdían lo que hacía que el fallo fuera peor todavía. Además de ser un fallo que a mí nunca me ha pasado y que no pude controlar.
Pues bien, hace unos días pensando que el problema tenía que ver con la compresión de imágenes y tener que trabajar con memoria pregunté por aquí y después de algún cambio me pareció que todo funcionaba bien. El caso es volvió a fallar y me pareció haber encontrado el fallo que no tenía nada que ver con las fotos en sí. Os pongo el código y os explico.
public void Camara()
{
try
{
//Este código es previo al evento de activar la cámara de fotos.
Intent icamara = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
Time now = new Time();
archivo = "";
now.setToNow();
//Aquí me creo un archivo (file) cuyo nombre será un código + un tipo + hora
archivo = Environment.getExternalStorageDirectory() + "/external_sd/Fotos/"+ "ID" + parte.getID()+ tipoFoto + now.format2445().toString() +".jpg";
file = new File(archivo);
//Finalmente ejecuto la actividad cámara pasándole dicho archivo como parámetro
Uri outputFileUri = Uri.fromFile(file);
icamara.putExtra(MediaStore.EXTRA_OUTPUT, outputFileUri);
startActivityForResult(icamara,0);
}
catch(Exception e)
{
Toast.makeText(getApplicationContext(), e.getMessage(), Toast.LENGTH_LONG).show();
}
}
El código anterior se produce al pulsar el botón correspondiente y digamos que es sólo para guardar un archivo para que yo lo controle. El siguiente código se ejecuta al pulsar "Guardar" al tomar una foto.
public void onActivityResult (int requestCode, int resultCode, Intent data)
{
if(requestCode ==0 && resultCode == RESULT_OK)
{
pactual = posicion;
posicion ++;
try
{
/*Convierto el archivo generado en la previa a un bitmap para tratarlo como imagen y las últimas pruebas me han dado a entender que el fallo está en alguna de las siguientes 4 líneas*/
Bitmap mybit = BitmapFactory.decodeFile(file.getAbsolutePath());
imagen.setImageBitmap(mybit);
imagen.setScaleType(ScaleType.FIT_XY);
//Añado la foto a la lista de fotos (array) existente.
parte.Fotos.addImagen(file.getAbsolutePath(), tipoFoto);
if(parte.Fotos.getNumeroFotos(tipoFoto)>0)
{
eliminar.setVisibility(View.VISIBLE);
}
if(parte.Fotos.getNumeroFotos(tipoFoto)>1)
{
siguiente.setVisibility(View.VISIBLE);
}
//Aqui cambiamos el tamaño de la imagen y lo comprimimos para ocupar mucho menos espacio y seguir tomando fotos si no se ha cancelado.
Comprimir(file.getAbsolutePath(), mybit);
Camara();
}
catch(Exception ex)
{
pactual = posicion = 0;
Toast.makeText(getApplicationContext(),"Se ha producido un error, vuelva a tomar la foto", Toast.LENGTH_LONG).show();
}
}
}
El caso es que he conseguido que la aplicación no se cierre de golpe y muestre el mensaje de error del "catch" del evento onActivityResult. Sin embargo tengo 2 problemas, es algo que me sucede de manera tan aleatoria que no puedo estar seguro de que sea lo que yo creo. Segundo, no puedo hacer una traza o mostrar un log ya que los teléfonos que fallan están repartidos por España y el que tengo yo falló hace unos días y no se conecta en modo depuración USB por lo que no puedo conectarme directamente desde Java y comprobar la ejecución.
Lo que os pido es simplemente si me podéis decir si hay algún fallo claro en mi código que haga que falle la aplicación y que yo no vea y pueda causar cualquier fallo no controlado. Gracias de antemano.