¿Cómo puedo obtener una lista de directorios de recursos de mi aplicación para Android?
Mi aplicación de Android tiene algunos archivos en el directorio de activos que quiero abrir al iniciar, enumerando los archivos del directorio y abriéndolos. Estoy tratando de utilizar el AssetManager para hacer esto, pero no parece hacer lo que esperaba. Mi código de ejemplo está abajo. ¿Es esta la forma correcta o hay una mejor manera de hacer esto?
Y estoy usando el siguiente método para imprimir el árbol de directorio de activos.
void displayFiles (AssetManager mgr, String path) { try { String list[] = mgr.list(path); if (list != null) for (int i=0; i<list.length; ++i) { Log.v("Assets:", path +"/"+ list[i]); displayFiles(mgr, path + list[i]); } } catch (IOException e) { Log.v("List error:", "can't list" + path); } }
Desde el método onCreate de mi actividad, hago lo siguiente:
final AssetManager mgr = getAssets(); displayFiles(mgr, "/assets"); displayFiles(mgr, "./assets"); displayFiles(mgr, "/"); displayFiles(mgr, "./");
Que me da la siguiente salida
09-29 20: 08: 27.843: DEBUG / GFlash (6543): //AndroidManifest.xml 09-29 20: 08: 27.954: DEBUG / GFlash (6543): // META-INF 09-29 20: 08: 28.063: DEBUG / GFlash (6543): // activos 09-29 20: 08: 28.233: DEBUG / GFlash (6543): //classes.dex 09-29 20: 08: 28.383: DEBUG / GFlash (6543): // com 09-29 20: 08: 28.533: DEBUG / GFlash (6543): // res 09-29 20: 08: 28.683: DEBUG / GFlash (6543): //resources.arsc
¡Gracias por adelantado!
John
Ugh. El problema estaba en el método displayFiles, faltaba el separador, "/", entre el directorio y el nombre de archivo. Lo siento si perdí el tiempo de nadie. Una versión corregida de displayFiles está abajo.
void displayFiles (AssetManager mgr, String path) { try { String list[] = mgr.list(path); if (list != null) for (int i=0; i<list.length; ++i) { Log.v("Assets:", path +"/"+ list[i]); displayFiles(mgr, path + "/" + list[i]); } } catch (IOException e) { Log.v("List error:", "can't list" + path); } }
John
Para ser completamente recursivo puede actualizar el método de la manera siguiente:
void displayFiles (AssetManager mgr, String path, int level) { Log.v(TAG,"enter displayFiles("+path+")"); try { String list[] = mgr.list(path); Log.v(TAG,"L"+level+": list:"+ Arrays.asList(list)); if (list != null) for (int i=0; i<list.length; ++i) { if(level>=1){ displayFiles(mgr, path + "/" + list[i], level+1); }else{ displayFiles(mgr, list[i], level+1); } } } catch (IOException e) { Log.v(TAG,"List error: can't list" + path); } }
Luego llame con:
final AssetManager mgr = applicationContext.getAssets(); displayFiles(mgr, "",0);