0 votos

Hola Ramon, lo primero gracias de antemano, por anteriores contestaciones. Bien puesta vez estoy echo un lio con esto veras: voy a intentarte explicar lo mejor que pueda.
Tengo creada una base de datos sqlite, donde tengo guarda la direccion o el path a una fotografia (ademas de otros campos), bien lo que hago es una consulta a la BD, de la respuesta obtengo el path y a su vez este path lo meto como Extras en un intent que lanza otra activity, hasta aqui todo bien.
Te aclaro que la fotografia en cuestion esta en la SD interna del dispositivo, dentro de un fichero creado por mi para esta app.
Esta es la ruta = file:///storage/emulated/0/Pictures/Fotos_Lugar/Lugar_20140930_142116.JPG

Ahora cuando intento convertir el fichero de este path en un bitmap es cuando me dice que nada de nada.

BitmapFactory.Options options = new BitmapFactory.Options();
options.inPreferredConfig = Config.ARGB_8888;
Bitmap imagen = BitmapFactory.decodeFile(path_de_la_ruta_donde_esta_la_foto, options);

En el degub me dice que la variable (imagen=null)

Estoy pensando que quizas sea que esta activity no forme parte del mismo contesto. Si fuera asi como podria pasarle el contesto? .Que metodo podria usar?, cualquier cosa que se te ocurra me vendria bien. Lo dicho muchas gracias. Un saludo.

por en Android

1 Respuesta

0 votos
Mejor respuesta

Si estás trabajando sobre una clase que herede de Activity estás heredando de Context, con lo que no necesitas pasarle el context (si te quieres asegurar llama al método getApplicationContext() para obtener el Context de la aplicación).
Asegúrate estar recibiendo el path en el método decodeFile y que el fichero exista. También deberías obtener la ruta externa por algún método de Android, nunca a mano (imagínate que en un móvil no se llama una parte de la ruta “storage” sino “drive”, ya la ruta absoluta no sirve). Te escribo un ejemplo simple y funcional para hacer lo que necesitas:

String FICHERO = "Nombre_del_fichero.png";
File ruta = getExternalFilesDir(null);
File fichero = new File(ruta, FICHERO);
if (fichero.mkdirs()) {
	Bitmap myBitmap = BitmapFactory.decodeFile(fichero.getAbsolutePath());
}

 

por

Hola Ramon mil gracias por contestar tan pronto, entiendo lo que me dices, pero como te explico anteriormente yo tengo la ruta del fichero y el nombre todo junto en un string es este file:///storage/emulated/0/Pictures/Fotos_Lugar/Lugar_20140930_142116.JPG. Osea que el path le llega y el fichero existe, me lo devuelve una consulta a la DB:

Bitmap myBitmap = BitmapFactory.decodeFile(file:///storage/emulated/0/Pictures/Fotos_Lugar/Lugar_20140930_142116.JPG);

y el debug me dice que myBitmap es null;

Espero me entiendas.

Bien, te sirve el mismo ejemplo que te pasé antes.

Solo te queda comprobar que el fichero exista, que los medios extraibles estén disponibles y que la ruta sea correcta.

Hola Ramon, muchas gracias por tus respuetas, pongo aqui como lo he resuelto por si alguien mas le interesa:

// Recojo de los extras el String y lo paso a Uri
String fotoCaptura = extras.getString(“foto”);
Uri urifoto = Uri.parse(fotoCaptura);

Bitmap imagen = getBitmapFromUri (urifoto);

//Fuente: https://developer.android.com/guide/topics/providers/document-provider.html#open

private Bitmap getBitmapFromUri ( Uri uri ) throws IOException {
ParcelFileDescriptor parcelFileDescriptor =
getContentResolver (). openFileDescriptor ( uri , “r” );
FileDescriptor fileDescriptor = parcelFileDescriptor . getFileDescriptor ();
Bitmap image = BitmapFactory . decodeFileDescriptor ( fileDescriptor );
parcelFileDescriptor . close ();
return image ;
}

Espero que os sirva. Ramon otra vez mil GRACIAS. Un saludo.

No hay de qué Alfonso, ayudaremos siempre que podamos. Tu aportación será muy útil y de agradecer por muchos desarrolladores :)

Creo q me has solucionado gran parte del problema q tenia pq necesito coger una imagen y guardarla en la base de datos, por lo q la imagen cuando la selecciono me sale en archivo uri, para poderla meter en base de datos la quiero comprimir antes, por lo q necesitaria obtenerla del archivo uri no? Tal y como tu codigo hace supongo y luego cuando la comprima la metere en la base de datos. O se puede comprimir directamente el archivo uri?
La URI es la dirección donde está guardado el archivo de la imagen, además, la URI es la que se guardaría en la base de dato (en formato String).

Si quieres comprimir la imagen, primero comprímela (y elimina la original por ahorrar espacio), toma la ruta hasta el fichero comprimido y la guardas en la base de datos. Para recuperar la imagen puedes hacer el sentido contrario: tomas la ruta de la base de datos, descomprimes la imagen a una carpeta temporal (no recuerdo ahora si permitía descomprimir en memoria directamente, algunos métodos de descompresión permiten leer desde el comprimido directamente) y usas la ruta de la imagen sin comprimir para mostrar la imagen.