Paso a paso
A continuación veremos cómo guardar imágenes desde nuestro directorio de recursos en la memoria interna y cómo obtenerlas y eliminarlas.- Conversión de Bitmap a byte[]
- Guardar en la memoria interna
- Extraer de la memoria interna y usar
- Eliminar de la memoria interna
1. Conversión de Bitmap a byte[]
La conversión de las imágenes a byte[] es imprescindible para poder hacer operaciones con ellas. El siguiente trozo de código nos muestra cómo obtener un Bitmap a partir de una imagen que tengamos guardada en la carpeta “assets” de nuestro proyecto (“app/src/main/assets”). Consiste en abrir un flujo de entrada (InputStream) hacia el archivo de la carpeta “assets” y convertirlo en Bitmap con el método
decodeStream()
de BitmapFactory. Tendremos que capturar una posible IOException.
1 2 3 4 5 6 7 |
Bitmap bmp = null; try { InputStream inputStream = getAssets().open("imagen.gif"); bmp = BitmapFactory.decodeStream(inputStream); }catch (IOException io){ io.printStackTrace(); } |
1 2 3 |
ByteArrayOutputStream stream = new ByteArrayOutputStream(); bmp.compress(Bitmap.CompressFormat.PNG, 100, stream); byte[] byteArray = stream.toByteArray(); |
2. Guardar en la memoria interna
Ahora ya podemos guardarlo en la memoria interna de la misma manera que se guarda cualquier otro byte[]. Crearemos un flujo de dalida de archivos (FileOutputStream) hacia un archivo en el directorio “files”. Si el directorio o el archivo no existen (como es el caso), se crearán automáticamente. Abrir un flujo de salida de archivos crea el archivo automáticamente o usa uno ya existente con el mismo nombre. A este flujo le diremos que escriba nuestro byte[] y luego lo cerraremos. Tendremos que capturar una FileNotFoundException y un IOException. Si nos da pereza, podemos capturar solamente Exception y utilizar
instanceof
.
1 2 3 4 5 6 7 8 9 |
try { FileOutputStream outputStream = getApplicationContext().openFileOutput("imagen.gif", Context.MODE_PRIVATE); outputStream.write(byteArray); outputStream.close(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e2) { e2.printStackTrace(); } |
openFileOutput()
nos dará un objeto FileOutputStream hacia el archivo “imagen.gif” (si no existe lo creará) situado en el directorio de los archivos privados de la aplicación, cosa que le indicamos pasándole Context.MODE_PRIVATE
como segundo argumento. Si ahora vamos al Android Device Manager podremos ver cómo se han creado el directorio y el archivo:
Observa que, aunque la imagen tenía una extensión GIF, podíamos haberlo omitido, ya que al ser un byte[], la extensión no le afecta. Se guardará como un archivo txt.
3. Recuperar el archivo y usarlo
Recuperar el archivo consistirá en abrir un flujo de entrada de archivos (FileInputStream) apuntando hacia el archivo en concreto y convertirlo de nuevo en byte[] para después pasarlo a Bitmap.
1 2 3 4 5 6 7 8 9 10 11 |
Bitmap bitmap = null; try{ FileInputStream fileInputStream = new FileInputStream(getApplicationContext().getFilesDir().getPath()+ "/imagen.gif"); bitmap = BitmapFactory.decodeStream(fileInputStream); }catch (IOException io){ io.printStackTrace(); } imageView.setImageBitmap(bitmap); |
getFilesDir().getPath()
, que nos dará la ruta al directorio “data/data/nuestraAplicación/files”, y le concatenamos una barra y el nombre del archivo que queremos recuperar. Luego obtenemos el Bitmap utilizando el método BitmapFactory.decodeStream()
y lo cargamos en un ImageView.
4. Eliminar un archivo de “files”
Esta es la parte más sencilla. Consiste en crear un objeto File que apunte hacia el archivo que queremos eliminar y ejecutar sobre este el método
delete()
, que devolverá un booleano indicando si se ha eliminado el archivo o no.
1 |
boolean eliminado = new File(context.getFilesDir().getPath() + "/imagen.gif").delete(); |
false
cada vez que lo intentemos borrar, creyendo que el archivo está en el dispositivo cuando en realidad no lo está. Para ello solo tendríamos que ejecutar sobre el objeto File el método exists()
.
1 2 3 |
File file = new File(context.getFilesDir().getPath() + "/imagen.gif"); if (file.exists()) boolean eliminado = file.delete(); |
filePath
y status
valdrán null
.
Hola, ¿Me podríais decir como podría guardar una imagen o video proveniente de la cámara en la memoria interna?
Se que se puede hacer con un File Provider, pero no termino de enterarme en las explicaciones en ingles.
Gracias por la ayuda!
Buenas Tardes, Probé tú ejemplo, guarda correctamente, pero al querer obtener la imagen tipo GIF para mostrarla en un layout, no lo hace, al parecer cuando comprime a imagen para guardarla en la BD pierde las características de gif y por lo tanto no funciona con imagenes gif.