Ficheros Android - Almacenamiento Externo

Hola de nuevo chic@s! En esta lección vamos a trabajar con la memoria externa, como comprobar su disponibilidad, y por ultimo como crear y leer ficheros en ella ¡empecemos! ¡yujuuuuuu!

Al principio de la lección anterior sobre la memoria interna de un dispositivo Android, vimos los tipos de memoria y sus diferencias. Como vimos, todos los dispositivos Android tienen dos áreas de almacenamiento de archivos: "interna" y "externa". Estos nombres provienen de los primeros días de Android, cuando la mayoría de los dispositivos ofrecian una función de la memoria no volátil (memoria interna), además de un medio de almacenamiento extraíble, como una tarjeta micro SD (almacenamiento externo). Hoy en dia la mayoria de dispositivos particionan la memoria permanente o interna con otra particion externa, por lo que incluso sin un medio de almacenamiento extraíble, siempre hay dos espacios de almacenamiento. Recuerda que las ranuras SD no tienen nada que ver con esta memoria, las ranuras SD no son parte del almacenamiento externo, y nuestras aplicaciones no podrán acceder a esta tarjeta SD, este almacenamiento extra es sólo para que podamos proporcionar ficheros multimedia que el sistema escanea. La siguiente lista resume las ventajas de cada uno de los tipos de almacenamiento:

Almacenamiento interno:
 Siempre disponible.
 Los archivos guardados aquí se puede acceder sólo por su aplicación de forma predeterminada.
 Cuando el usuario desinstala la aplicación, el sistema elimina todos los archivos de la aplicación de almacenamiento interno.
 El almacenamiento interno es mejor cuando quieres estar seguro de que ni el usuario ni otras aplicaciones pueden tener acceso a sus archivos.

Almacenamiento externo:
 No siempre está disponible, ya que el usuario puede montar el almacenamiento externo como almacenamiento USB y en algunos casos eliminar desde el dispositivo.
 Es de lectura global, por lo que los archivos guardados aquí pueden ser leídos fuera de su control.
 Cuando el usuario desinstala la aplicación, el sistema elimina los archivos de su aplicación de aquí sólo si los guarda en el directorio desde getExternalFilesDir ().
 Almacenamiento externo es el mejor lugar para los archivos que no requieren restricciones de acceso y de los archivos que desea compartir con otras aplicaciones o permitir al usuario acceder a un ordenador.

Otra nota rápida antes de continuar con este tema!! Para poder probar aplicaciones que hagan uso de la memoria externa tendremos que decirselo al emulador, cuando abras el AVD Manager, edita el dispositivo que uses normalmente y comprueba que tienes un valor en el "Size" de la SD Card (en mi caso puse 10Mb) que para hacer pruebas es mas que de sobra.

Después en Hardware, comprueba que tengas instalado la propiedad "SD Card Support" si no lo tienes, pulsa sobre "New" y busca esta propiedad en el menu desplegable.

Bueno, creo que ahora si que estas listo para continuar!! recuerda que también puedes conectar tu dispositivo físico osease tu móvil a Eclipse, de esta manera también te aseguras que nuestro programa funciona correctamente antes de subirlo a GooglePlay!! tienes mas información sobre esto ultimo en la lección dedicada al emulador de Eclipse.

Permisos necesarios para escribir en la memoria Externa

Lo primero que tenemos que hacer para cuando queremos escribir en la memoria externa, es solicitar WRITE_EXTERNAL_STORAGE permission en tu manifest.xml, para ello deberas añadir la siguiente linea:

	
    
    ...
	
				

Atención: En la actualidad, todas las aplicaciones tienen la capacidad de leer el almacenamiento externo sin un permiso especial. Sin embargo, esto cambiará en una versión futura de Android. Si tu aplicación necesita leer el almacenamiento externo (pero no escribir en él), entonces tendrás que declarar el permiso READ_EXTERNAL_STORAGE para asegurar que su aplicación sigue funcionando como se esperaba cuando Google implemente este cambio (en la documentacion oficial no dice cuando, asi que por si acaso ponlo).

	
    
    ...
	
				

Como verificar el estado y disponibilidad de la Memoria Externa

Como vimos al principio, esta memoria puede existir o no en tu dispositivo, por eso lo primero que tenemos que hacer es comprobar si tenemos disponible esta memoria en nuestro dispositivo, es posible que pienses.... ¡va que exagerao, todos los teléfonos tienen memoria externa! pos nooooooooooo (jajajajaj) por si no lo sabes, el Nexus4 de google no tiene memoria externa, este teléfono solo tiene una única partición de "almacenamiento interno" y tampoco dispone de una ranura SD :s.

Por todo ello, veamos como comprobamos esto antes!!

//Guardamos en una variable el estado de la memoria externa
String state = Environment.getExternalStorageState();

if (Environment.MEDIA_MOUNTED.equals(state)) {
    // podemos escribir y leer en la memoria externa
    
} else if (Environment.MEDIA_MOUNTED_READ_ONLY.equals(state)) {
    // solo podemos leer la memoria externa

} else {
    // algo salio mal. no puedes leer ni escribir o no esta

}

En este código se comprueba si la memoria externa está disponible para leer y escribir. El método getExternalStorageState() devuelve otros estados que puedes probar, como por ejemplo, si el medio de comunicación está siendo compartido (conectado a un ordenador), si falta por completo, si se ha quitado mal, etc... podemos utilizar estas cosas para notificar al usuario en caso necesario.

Crear Fichero en Memoria Externa

Bueno, a partir de ahora vamos a suponer que tenemos disponible la memoria externa, y que esta lista para ser escrita! el proceso de escritura es parecido al de la memoria interna, lo único adicional, es que antes deberemos crear el directorio o ubicación donde ira nuestro fichero. ¡veamos un ejemplo!

Crear fichero y ubicación del fichero

// Creo el directoio para guardar el fichero
File dir = new File(Environment.getExternalStorageDirectory() + "/MiDirectorio/");

// si el direcctorio no existe, lo creo
if (!dir.exists()) {
		System.out.println("creando directorio: " + "MiDirectorio");
		dir.mkdir();
}

// Creamos el fichero en su ubicación completa
File file = new File(dir, "MiFichero.txt");

lo digo siempre! si pones el ratón encima del código, Eclipse muestra una ayuda de sintaxis, esto ayuda mucho a ver como se usa cada clase y método!. Con getExternalStorageDirectory() + "MiCarpeta" estamos definiendo que a la raíz del almacenamiento externo, crearemos la carpeta "MiCarpeta", lo siguiente es comprobar si esta carpeta existe, si es la primera vez que ejecutamos este código, se creara la carpeta, si ya estaba creada, porque ya lo ejecutamos antes, no la volverá a crear.

Escritura del fichero en la memoria externa
Vamos a ver como escribimos en el fichero! hay que poner el código entre bloques try/catch.

try{
	//Preparamos el Stream
	OutputStreamWriter bf = new OutputStreamWriter(new FileOutputStream(file));

	// escribimos linea en el fichero...
	bf.write("mi primera linea");

	// cambiamos de linea
	bf.write("\n");

	// escribimos una segunda linea en el fichero...
	bf.write("mi segunda linea");

	// Cerramos el Fichero donde guardamos la BD
	bf.close();
} 
catch (Exception ex)
{
	Log.e("Ficheros", "Error al escribir fichero a tarjeta SD");
}

Explico un poco:
Linea 3. Definimos y preparamos el flujo de datos hacia el fichero.
Linea 6, 9 y 12. Escribimos 2 líneas y hacemos como un "enter" para cambiar de "fila" dentro del fichero.
Linea 15. Cerramos el flujo de datos hacia el fichero.

Por ultimo, por si no lo sabes, en la perpectiva DMMS hay una vista que explora los ficheros del emulador, podras comprobar si has creado los ficheros correctamente! ademas en el emuladore seras root, por lo que tendras acceso a toda la memoria!! ;P

perpectiva DMMS y vista File Explorer

¿que os parece? no es complicado, como todo requiere practica y hacer varias pruebas, pero vamos si yo pude. ¡tu también! animo y si no te aclaras, pregunta en el foro.

Si te a gustado este sitio, por favor haz click en me gusta en Facebook, Google+, Tweeter... es el único precio que te pido por este trabajo! ;P. Compartiendo, ayudaras a otros a encontrar esta web! GRACIASSSS.