Vamos a ver un ejemplo de como podemos obtener el listado de archivos y carpetas de nuestro android y poder recorrer la estructura de directorios para nuestras aplicaciones android. Y que mejor ejemplo que hacer un explorador de archivos, para poder ver todos nuestros archivos.
En este ejemplo vamos a ver como mostrar la estructura de archivos de nuestra memoria ¿externa?, lo de externa lo pongo entre interrogaciones porque puede llevar a confusiones ya que aunque en muchos dispositivos si que tienen realmente una memoria externa (microSD) hay en otros como el Nexus, muchos android TV o mi Moto G por ejemplo que no tienen SD, pero una parte de su memoria actúa como memoria externa, para que quede más claro, el lugar donde guardamos nuestra música, videos, etc. ya que es donde tendremos interés en explorar los archivos que tenemos.
Empecemos con el código…
En el onCreate de nuestra aplicación además de establecer el layout que vamos a utilizar, guardamos una referencia al TextView que utilizaremos para que en todo momento podamos ver en que directorio nos encontramos para no perdernos y obtenemos la ruta a nuestra memoria externa con Environment.getExternalStorageDirectory().
public class PoIExplorer extends ListActivity {
private List listaNombresArchivos;
private List listaRutasArchivos;
private ArrayAdapter adaptador;
private String directorioRaiz;
private TextView carpetaActual;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
carpetaActual = (TextView) findViewById(R.id.rutaActual);
directorioRaiz = Environment.getExternalStorageDirectory().getPath();
verArchivosDirectorio(directorioRaiz);
}
}
Una vez que tenemos el path (la ruta) de nuestro directorio raíz llamamos al método verArchivosDirectorio() donde vamos a realizar el procedimiento para ver los archivos que cuelgan directamente del directorio que le pasemos como parámetro.
/**
* Muestra los archivos del directorio pasado como parametro en un listView
*
* @param rutaDirectorio
*/
private void verArchivosDirectorio(String rutaDirectorio) {
carpetaActual.setText("Estas en: " + rutaDirectorio);
listaNombresArchivos = new ArrayList();
listaRutasArchivos = new ArrayList();
File directorioActual = new File(rutaDirectorio);
File[] listaArchivos = directorioActual.listFiles();
int x = 0;
// Si no es nuestro directorio raiz creamos un elemento que nos
// permita volver al directorio padre del directorio actual
if (!rutaDirectorio.equals(directorioRaiz)) {
listaNombresArchivos.add("../");
listaRutasArchivos.add(directorioActual.getParent());
x = 1;
}
// Almacenamos las rutas de todos los archivos y carpetas del directorio
for (File archivo : listaArchivos) {
listaRutasArchivos.add(archivo.getPath());
}
// Ordenamos la lista de archivos para que se muestren en orden alfabetico
Collections.sort(listaRutasArchivos, String.CASE_INSENSITIVE_ORDER);
// Recorredos la lista de archivos ordenada para crear la lista de los nombres
// de los archivos que mostraremos en el listView
for (int i = x; i < listaRutasArchivos.size(); i++){
File archivo = new File(listaRutasArchivos.get(i));
if (archivo.isFile()) {
listaNombresArchivos.add(archivo.getName());
} else {
listaNombresArchivos.add("/" + archivo.getName());
}
}
// Si no hay ningun archivo en el directorio lo indicamos
if (listaArchivos.length < 1) {
listaNombresArchivos.add("No hay ningun archivo");
listaRutasArchivos.add(rutaDirectorio);
}
// Creamos el adaptador y le asignamos la lista de los nombres de los
// archivos y el layout para los elementos de la lista
adaptador = new ArrayAdapter(this, R.layout.text_view_lista_archivos, listaNombresArchivos);
setListAdapter(adaptador);
}
El código esta comentado prácticamente línea por línea, por lo que hay poco más que añadir. Quizás lo más importante es indicar que se crean dos listas, una con los nombres de los archivos o directorios y otra con sus rutas, para usar la primera como base para mostrar en el ListView y la de las rutas para poder acceder a los archivos y por lo tanto hay que tener cuidado de ambas listas tengan el mismo numero de elementos y de que estén ordenadas de la misma forma para que cuando seleccionemos un archivo de nuestro ListView realmente se abra dicho archivo y no otro.
Para poder navegar por los directorios y poder «abrir» los archivos necesitamos sobre escribir el método onListItemClick y aquí abriremos el archivo o directorio seleccionado en el listView que hemos creado con la lista de nombres de los archivos y lo abriremos usando la lista de las rutas de los archivos ya que como hemos visto antes ambas están relacionadas y por lo tanto podemos usar cada una para lo que nos interese.
Cuando hacemos click en un elemento pueden suceder 2 cosas que sea un archivo o que sea un directorio, por lo que tenderemos que controlar esa circunstancia para que no se produzcan errores. Si es directorio esta claro que lo que debemos de hacer es hacer una llamada al método verArchivosDirectorio() con la ruta del directorio en cuestión para poder explorar los archivos que contiene y si es un archivo pues ya depende de lo que queramos hacer en nuestra aplicación con dicho archivo, abrirlo con cualquier aplicación, con la nuestra, compartirlo, borrarlo, editarlo o lo que queremos, pero como esto es una aplicación de ejemplo sencilla simplemente vamos a mostrar el nombre del archivo mediante un Toast para mantenerlo todo muy sencillito.
@Override
protected void onListItemClick(ListView l, View v, int position, long id) {
// Obtenemos la ruta del archivo en el que hemos hecho click en el listView
File archivo = new File(listaRutasArchivos.get(position));
// Si es un archivo se muestra un Toast con su nombre y si es un directorio
// se cargan los archivos que contiene en el listView
if (archivo.isFile()) {
Toast.makeText(this, "Has seleccionado el archivo: " + archivo.getName(),
Toast.LENGTH_LONG).show();
} else {
// Si no es un directorio mostramos todos los archivos que contiene
verArchivosDirectorio(listaRutasArchivos.get(position));
}
}
Y eso es todo en cuanto al código java de esta sencilla aplicación, los layouts no los pongo porque no tienen ninguna particularidad especial, pero si que puedes están incluidos junto con el resto del código del proyecto el enlace de unas líneas más abajo.
Y con esto esta todo si ejecutamos la aplicación en una versión anterior a la 4.4 (al menos hasta la 4.2.2 funciona) pero no te preocupes que no has estado perdiendo el tiempo viendo como hacer una aplicación que no funciona en la versión actual de android como pensé yo al probarla en mi Moto G. Para que funcione en nuestro android 4.4 solo hay que añadir el permiso para poder leer de la memoria externa a nuestro AndroidManifest.xml con lo que nos quedaría algo como lo siguiente.
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.poi.explorer"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="19" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<application
android:allowBackup="false"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name="com.poi.explorer.PoIExplorer"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
Con esto ya podemos dar por finalizado este ejemplo que puedes descargarte desde aquí para modificarlo, probarlo en tu móvil o lo que tu quieras (el apk esta dentro de la carpeta bin).
Captura de pantalla de la aplicación ejecutándose en un LG E510 con android 4.1.2 (CyanogenMod 10).