Bienvenidos sean a este post, hoy veremos una alternativa al post anterior para almacenar las puntuaciones de nuestro juego Asteroides en una memoria externa, para ello deberemos abrir nuestro proyecto y seleccionaremos la clase creada en nuestro post anterior, AlmacenPuntuacionesArchivoInterno, para presionar Ctrl+C o click con el boton derecho Copy, una vez hecho esto presionen Ctr+V donde aparecera un cuadro y modificaremos el nombre de la clase por AlmacenPuntuacionesArchivoExterno, con esto crearemos una nueva clase y ahora prcederemos a modificar las sutiles diferencias, primero cambiaremos la siguiente linea:
private static String ARCHIVO = "puntuaciones.txt";
Por esta otra linea:
private static String ARCHIVO = Environment
.getExternalStorageDirectory() + "/puntuaciones.txt";
Esta linea nos permitira obtener la ubicacion de nuestra memoria externa, la forma ideal es hacerlo de esta manera por el hecho de que este valor varia dependiendo de si el equipo es real o virtual y tambien del fabricante, luego le decimos el nombre de nuestro archivo, nuestra siguiente modificacion sera en el metodo guardarPuntuacion() donde modificaremos la siguiente linea:
FileOutputStream a = contexto.openFileOutput(ARCHIVO,Context.MODE_APPEND);
Por esta linea:
FileOutputStream a = new FileOutputStream(ARCHIVO,true);
Con esta linea iniciaremos correctamente a nuestra archivo porque recuerden que ahora no estamos en el telefono y por ende tambien se modifica la forma de busqueda, con esto lo iniciaremos para permitirnos la escritura sobre nuestro archivo, el resto debe quedar como estaba antes, nuestra siguiente modificacion sera sobre listaPuntuacion() donde modificaremos la siguiente linea:
FileInputStream a = contexto.openFileInput(ARCHIVO);
Por esta linea:
FileInputStream a = new FileInputStream(ARCHIVO);
La linea hace exactamente lo mismo a la anterior pero ahora adecuada para poder utilizar la memoria externa, nuestra siguiente modificacion sera en MainActivity donde modificaremos la siguiente linea en onCreate():
almacen = new AlmacenPuntuacionesArchivoInterno(this);
Por esta otra linea:
almacen = new AlmacenPuntuacionesArchivoExterno(this);
Esta linea lo unico que modifica es cual clase debe ser llamada para manipular nuestras puntuaciones, nuestra ultima modificacion sera en AndroidManifest.xml para permitir el acceso a nuestra memoria externa para ello agregaremos el siguiente bloque:
<uses-permission
android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
Con esta modificacion podemos probar nuestra app, si necesitan configurar una SD en el equipo virtual les recomiendo este post donde explico el paso a paso de como hacerlo, si lo probamos trabajara de la misma forma que en el post anterior pero la diferencia la veremos en la ubicacion del archivo tal como se ve en la siguiente imagen

Si vemos a traves del Device File Explorer podemos observar como efectivamente se creo nuestro archivo dentro de la memoria externa pero esta ubicada en la raiz de nuestra memoria, deberiamos hacer dos modificaciones mas una para chequear que la memoria exista y otra para ubicar de mejor forma nuestro archivo, primero modifiquemos en la clase AlmacenPuntuacionArchivoExterno el metodo guardarPuntuacion() agregando el siguiente bloque:
String estadoSD = Environment.getExternalStorageState();
if (!estadoSD.equals(Environment.MEDIA_MOUNTED)){
Toast.makeText(contexto,"No se puede escribir en la memoria"
, Toast.LENGTH_SHORT);
return;
}
En la primer linea averiguaremos el estado de nuestra memoria y esto lo almacenara en estadoSD, el condicional chequea si estadoSD no es igual, esto gracias al signo de admiracion (!) el cual invierte todo lo siguiente a ella, al estado MEDIA_MOUNTED el cual indica que el medio esta desconectado si es verdadero nos mostrara un mensaje en pantalla y nos sacara de la clase, nuestra siguiente modificacion sera en el metodo listarPuntuacion() donde agregaremos el siguiente bloque:
String estadoSD = Environment.getExternalStorageState();
if(!estadoSD.equals(Environment.MEDIA_MOUNTED) &&
!estadoSD.equals(Environment.MEDIA_MOUNTED_READ_ONLY)){
Toast.makeText(contexto,"No se puede leer la memoria",
Toast.LENGTH_SHORT).show();
return resultado;
}
En este caso tambien es similar al anterior primero obtenemos el estado de la memoria, luego chequearemos si estado de la memoria es distinto de montado (MEDIA_MOUNTED) y de montado como solo lectura (MEDIA_MOUNTED_READ_ONLY) si se cumplen estas dos condiciones nos mostrara el mensaje en pantalla y devolvera resultado, nuestra siguiente modificacion sera la ubicacion del archivo para ello modificaremos a nuestra constante ARCHIVO de la siguiente forma:
private static String ARCHIVO = Environment.getExternalStorageDirectory() +
"/Android/data/com.tinchicus.asteroides/files/puntuaciones.txt";
Observen como ahora le agregamos una ubicacion en la cual deberian modificar la parte de com.tinchicus.asteroides por el nombre del paquete que tienen ustedes, p.e. com.example.asteroides, el resto debe quedar como figura, para nuestra siguiente modificacion iremos a guardarPuntuacion() y agregaremos el siguiente bloque:
File ruta = new File(Environment.getExternalStorageDirectory()
+ "/Android/data/com.tinchicus.asteroides/files/");
if (!ruta.exists())
ruta.mkdirs();
Con la primera linea asignaremos la ruta de donde estara nuestro archivo, observen que debe coincidir con el informado en ARCHIVO, luego chequearemos si existe, en caso de no existir (que seria el caso verdadero) procedera a crear el directorio, antes de probar nuestra app veremos como esta actualmente la carpeta Android

Probemos nuestra app, jugamos un poco y generamos una puntuacion, si miramos por medio del Device File Explorer veremos la siguiente imagen

Como pueden ver se generaron todas las carpetas y dentro de la misma se genero el archivo llamado puntuaciones.txt, si lograron esto Felicitaciones!!! porque han logrado crear su primer archivo con un directorio para mantenerlo identificado e individualizado.
En resumen, hoy hemos visto como manejar archivos en la memoria externa, como almacenar las puntuaciones en este nuevo archivo, primero creandolo por defecto, luego hicimos una modificacion para poder asignarle un directorio y como crear dicho directorio en caso de no existir, espero les haya sido util sigueme en Twitter o Facebook para recibir una notificacion cada vez que subo un nuevo post en este blog, nos vemos en el proximo post.

Tambien podes donar
Es para mantenimiento del sitio, gracias!
$1.50