Bienvenidos sean a este post, hoy veremos como podemos acceder a archivos pero por medio de nuestros recursos y para ello volveremos a nuestro proyecto Asteroides y trabajaremos sobre las puntuaciones, primero abramos nuestro proyecto, luego iniciaremos el emulador donde utilizamos nuestro proyecto, una vez iniciado y por medio del Device File Explorer buscaremos el archivo puntuaciones.txt, recuerden que lo tenemos en tres lugares distintos: la memoria interna, la externa y el directorio creado en el post anterior, elijan cualquiera de los tres y click con el boton derecho y seleccionen Save As, aparecera un cuadro y aqui deben seleccionar una carpeta de destino en la pc, luego vayan a la carpeta que seleccionaron presionen Ctrl+C sobre el archivo o click con el boton derecho y la opcion Copiar, luego vuelven a Android Studio, vayan a res/raw y presionen Ctrl+V o click con el boton derecho y seleccionen Paste, aparecera un nuevo cuadro donde deberan dejar como aparece y presionen Ok para copiar nuestro nuevo recurso, para nuestra siguiente modificacion iremos al contenedor de clases Java y seleccionaremos la clase AlmacenPuntuacionesArchivoInterno y presionen Ctrl+C o click con el boton derecho y la opcion Copy, presionamos Ctrl+V y nos aparecera un nuevo cuadro donde renombraremos el archivo por AlmacenPuntuacionesRecursosRaw, luego presionamos Ok para crear a nuestra nueva clase, con esto podremos pasar a modificar nuestra nueva clase, para este caso eliminaremos todo el contenido de guardarPuntuacion() porque ya no lo utilizaremos y eliminaremos esta linea:

private static String ARCHIVO = "puntuaciones.txt";

Nuestra siguiente modificacion sera en esta linea;

FileInputStream a = contexto.openFileInput(ARCHIVO);

La cual reemplazaremos por esta siguiente:

InputStream a = contexto.getResources().openRawResource(
R.raw.puntuaciones);

Y por ultimo, modificaremos la clase MainActivity a nuestra variable almacen de la siguiente forma:

almacen = new AlmacenPuntuacionesRecursosRaw(this);

Con estas modificaciones podemos probar nuestra app pero antes como queda finalmente nuestro codigo de AlmacenPuntuacionesRecursosRaw:

package com.tinchicus.asteroides;

import android.content.Context;
import android.os.Environment;
import android.util.Log;
import android.widget.Toast;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.Vector;

public class AlmacenPuntuacionesRecursosRaw implements
        AlmacenPuntuaciones {

    private Context contexto;

    public AlmacenPuntuacionesRecursosRaw(Context contexto){
        this.contexto = contexto;
    }

    public void guardarPuntuacion(int puntos, String nombre,
                                  long fecha){}

    public Vector<String> listaPuntuaciones(int cantidad){
        Vector<String> resultado = new Vector<String>();
        try
        {
            InputStream a = contexto.getResources().openRawResource(
                    R.raw.puntuaciones);
            BufferedReader entrada = new BufferedReader(new InputStreamReader(a));
            int n = 0;
            String linea;
            do
            {
                linea = entrada.readLine();
                if (linea!=null){
                    resultado.add(linea);
                    n++;
                }
            } while(n < cantidad && linea!=null);
            a.close();
        }
        catch (Exception e)
        {
            Log.e("Asteroides",e.getMessage(),e);
        }
        return resultado;
    }
}

Observen que nuestra forma de trabajar es exactamente igual a cuando lo vimos en este post, el de acceso a memoria interna, pero lo unico que modificamos fue la origen de nuestro archivo y la posibilidad de guardar nuestra puntuacion porque nosotros no podemos escribir sobre este recurso, si lo compilamos y ejecutamos al pulsar Puntuaciones veremos esto

Nuestro siguiente paso sera trabajar con Assets, otro tipo de recursos, para ello crearemos la carpeta assets para la cual iremos a la carpeta res, click con el boton derecho y seleccionen New -> Folder -> Assets Folder, aparecera un cuadro, lo dejan como asi como esta y presionen Finish para crearlo

Nota: Puede suceder que no aparezca y para ello deben ir a File -> Sync Project with Gradle Files para que se actualice el proyecto y aparezca

La nueva carpeta Assets aparecera por afuera de nuestros recursos, res, hacen con click con el boton derecho sobre ella y seleccionan New -> Directory, aparecera un nuevo cuadro donde ingresaremos el nombre carpeta y pulsemos Ok para crearla, con esta carpeta llamada carpeta creada vayamos a raw dentro de res y copiemos el archivo puntuaciones.txt desde este lugar a la nueva carpeta que creamos en Assets, con el archivo copiado a nuestra nueva carpeta procederemos a hacer lo visto anteriormente, tomamos la clase AlmacenPuntuacionesRecursosRaw presionamos Ctrl+C y luego presionamos Ctrl+V aparecera un cuadro y lo renombraremos por AlmacenPuntuacionesRecursosAssets, en la cual solo modificaremos la siguiente linea:

InputStream a = contexto.getResources().openRawResource(
R.raw.puntuaciones);

Por esta linea:

InputStream a = contexto.getAssets().open("carpeta/puntuaciones.txt");

En la cual le indicaremos que debe utilizar los recursos en Assets y el metodo open se encargara de buscar el archivo en la ubicacion especificada, por ultimo deberemos modificar la clase MainActivity donde cambiaremos a almacen de la siguiente forma:

almacen = new AlmacenPuntuacionesRecursosAssets(this);

Con esto si lo compilan y prueban deberan obtener un resultado similar al anterior.

En resumen, hoy hemos visto como poder utilizar archivos desde nuestros recursos almacenados en res, tanto raw como assets, tambien como hemos visto solamente podemos verlos pero no modificarlos, no por ahora, hemos trabajado con los dos tipos de recursos y la facilidad de las mismas, 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.

Anuncios