Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


Lista de activos en un subdirectorio utilizando AssetManager.list

Mi aplicación tiene un directorio de activos en el que he descargado un montón de archivos de texto que necesito cargar en tiempo de ejecución.

Tengo un directorio lleno de activos de un tipo particular (es decir, "assets / subdir") y quiero cargar todos los archivos en este directorio, uno a la vez.

Tengo código como este:

AssetManager assetMgr = getAssets(); String[] assetsIWant = assetMgr.list("subdir"); for(String asset: assetsIWant) { doAssetyThing(asset); } 

He intentado un zillion diversas versiones del parámetro a assetMgr.list () y no estoy consiguiendo dondequiera.

Si utilizo "/", obtendré una lista que contenga el directorio "assets", y unos cuantos elementos al azar (META_INF, por ejemplo). Si paso alguna otra cadena (como "assets" o "assets /" o "/ assets" o "/ assets /" o "mysubdir" o "mysubdir" o "assets / mysubdir" o …) Una matriz vacía.

La documentación es desafortunadamente bastante incoherente.

¿Alguien sabe cuál es la fórmula correcta para ese parámetro de lista ()?

  • Trabajo POST Multipart Solicitud con Volley y sin HttpEntity
  • Supervisar la memoria ocupada por mi aplicación en Android
  • Enviar cadena de teléfono Android a PC
  • MapView (mapas de android api v2) dentro de la distribución de fragmentos no muestra
  • Android Json y valores nulos
  • Programación orientada a objetos android
  • Cómo personalizar CameraView para Android ZBar QrCode Reader
  • Handler.postAtTime vs Handler.postDelayed
  • 9 Solutions collect form web for “Lista de activos en un subdirectorio utilizando AssetManager.list”

    Pasar una cadena vacía parece funcionar para mí. Obtengo una lista de los archivos en mi directorio de activos cuando hago lo siguiente:

     AssetManager aMan = appContext.getAssets(); String[] filelist = aMan.list(""); 

    He utilizado el siguiente código para listar el nombre del archivo en assets / myFolder /:

     String[] fileNames =getAssets().list("myFolder"); for(String name:fileNames){ System.out.println(name); } 

    Tenga en cuenta que el parámetro en la lista de métodos no contiene "/".

    No estoy seguro de por qué funciona de esta manera, pero cuando lista "/" , obtengo información de nivel de raíz, no cosas de mi directorio de "assets" . En realidad no encontré ninguna manera de listar correctamente mi carpeta de activos en el corto tiempo que pasé tratando.

    La solución que estoy usando es crear un directorio "subdir" dentro de mi directorio "assets" . Pongo todos los activos que quiero acceder en este "subdir" , y hacer:

    String[] assetsIWant = assetMgr.list("subdir");

    No sé por qué "/" enumera el directorio "assets" como uno de sus archivos, pero no tiene que especificar el directorio "assets" cuando da a list una ruta. Tal vez alguien más sabe, pero espero que este consejo le ayudará de todos modos.

    Cuando necesite tener acceso a una carpeta más profunda en su jerarquía, use

     String[] fileNames =getAssets().list("myFolder"+File.separator+"mysubfolder"); 

    En lugar de "/" dentro de la cadena, lo que le daría un conjunto de cadenas vacío como resultado.

    Hay un montón de preguntas similares alrededor de este tema, sospecho que está utilizando la carpeta de activos en un proyecto de biblioteca. Si intenta acceder a los recursos de un proyecto de biblioteca en android obtendrá contenidos vacíos y los síntomas exactos que ha descrito aquí

    De la documentación de "proyectos" de android

    Fuente: http://developer.android.com/tools/projects/index.html

    Los proyectos de biblioteca no pueden incluir activos en bruto

    Las herramientas no admiten el uso de archivos de recursos sin procesar (guardados en el directorio assets /) en un proyecto de biblioteca. Los recursos de activos utilizados por una aplicación deben almacenarse en el directorio assets / del propio proyecto de aplicación. Sin embargo, los archivos de recursos guardados en el directorio res / son compatibles.

    Si este es el caso, la respuesta es que sólo debe incluir activos RAW en la carpeta de activos de su proyecto de aplicación NO en ningún proyecto marcado como una biblioteca (puede comprobar esto haciendo clic derecho en su proyecto y seleccionando propiedades, seleccione la entrada android A la izquierda y mira la casilla de verificación is library)

    Supongamos que esta carpeta está configurada: Assets->SubDir1 . Usted tiene cosas en Subdir1 como A.txt , B.txt , C.txt . Así que desde el directorio del proyecto, sería Assets/SubDir1/A.txt .

    Teniendo esto en cuenta, la forma de acceder a ese archivo es similar a lo que estás haciendo, agregando una cosa. Esa cosa está en tu función de doAssetyThing . Usted tiene que poner el directorio de SubDir1 delante de él, incluso si usted hizo un filtro de "SubDir1" en el .list("");

    Ejemplo:

      AssetManager am = getResources().getAssets(); String [] list = am.list("SubDir1"); for (String s:list) { doAssetyThing("SubDir1/" + s); //I use this next line as the start of copying a pdf from one location //to another. I wanted to give you a real function in use. InputStream inStream = am.open("SubDir1/" + s); //more code } 

    Espero que esto sea claro y te ayude!

    Utilizo los dos métodos siguientes para asegurar que un activo determinado esté presente:

      protected boolean hasAsset(String id) { return hasAsset(id,""); } protected boolean hasAsset(String id, String dir) { int idx = id.indexOf('/'); if (idx > 0 && idx < id.length() - 1) { if (dir.length() > 0) { dir = dir + "/" + id.substring(0,idx); } else dir = id.substring(0,idx); return hasAsset(id.substring(idx + 1), dir); } try { return Arrays.asList(context.getAssets().list(dir)).contains(id); } catch (IOException e) { e.printStackTrace(); return false; } } 

    Esta solución parece funcionar para mí: Mantenga una copia de cada archivo que desea acceder desde un subdirectorio en el directorio de activos también. Utilice la misma convención. Ie list("subdirectory")

    No lee la carpeta de archivos en activos, pero lee todos los archivos "copiados" en su subdirectorio. ¡¡Extraño!! ¡Pero funciona!

    Por alguna razón, los directorios vacíos no aparecen en la lista.

    Por lo menos, en mi experiencia, no están en la lista.

    Es decir, si tiene algunos-dir / d1 / f1 y algunos-dir / d2 en el área de activos, y usted lista ("algunos dir"), d2 no aparece.

    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.