2011-06-30 23 views
19

necesito el nombre (cadena) de todos los archivos en res/prima/Android, ¿cómo puedo obtener una lista de todos los archivos en una carpeta?

Traté:

File f = new File("/"); 
String[] someFiles = f.list(); 

Parece que el directorio raíz es la raíz del emulador de Android ... y no mi directorio raíz de computadoras. Eso tiene bastante sentido, pero realmente no me ayuda a averiguar dónde existe la carpeta sin procesar.

Gracias!

Actualización: Gracias por todas las buenas respuestas. Parece que algunos de estos funcionan, pero solo me llevan a la mitad. Quizás una descripción más detallada ayude ...

Quiero obtener todos los archivos mp3 en la carpeta RAW así puedo obtener todos los nombres, y luego agregarlos a un URI para reproducir un MP3 aleatorio de la siguiente manera ...

String uriStr = "android.resource://"+ "com.example.phone"+ "/" + "raw/dennis"; 
Uri uri = Uri.parse(uriStr); 
singletonMediaPlayer = MediaPlayer.create(c, uri); 

Cuando pongo "dennis.mp3" en la carpeta de activos, sí muestra como se esperaba ... sin embargo, utilizando el código anterior, no puedo acceder a esa MP3 más ... a menos que haya algo en la línea de:

String uriStr = "android.assets://"+ "com.example.phone"+ "/" + "dennis"; 
Uri uri = Uri.parse(uriStr); 

Gracias de nuevo por las respuestas útiles hasta ahora.

+0

Sospecho que no se puede hacer referencia a un activo prima por URI. Es posible que deba pasarlo como un objeto AssetFileDescriptor. Simplemente llame a getResources(). OpenRawResourceFd (resourceID); –

Respuesta

49

para enumerar todos los nombres de sus activos primas, que son básicamente los nombres de los archivos con las extensiones se quitó, se puede hacer esto:

public void listRaw(){ 
    Field[] fields=R.raw.class.getFields(); 
    for(int count=0; count < fields.length; count++){ 
     Log.i("Raw Asset: ", fields[count].getName()); 
    } 
} 

Dado que los archivos reales no están sentados en el sistema de archivos, una vez están hablando por teléfono, el nombre es irrelevante y tendrá que referirse a ellos por el número entero asignado a ese nombre de recurso. En el ejemplo anterior, se puede obtener este número entero de este modo:

int resourceID=fields[count].getInt(fields[count]); 

Ésta es la misma int la que se obtendría haciendo referencia a R.raw.whateveryounamedtheresource

+0

¡Gracias! Hace exactamente lo que necesito :) – jasonsemko

+6

Para aclarar use java.lang.reflect.Field [] –

+0

@Captain Blammo, ¿qué tal un directorio en un host? ¿Puedo obtener una lista de archivos en el directorio en el host de Internet? – Behzad

3

necesito el nombre (cadena) de todos los archivos en res/prima/

No hay archivos en res/raw/ en el dispositivo. Esos son recursos. No hay una buena forma de iterar sobre recursos, que no sea el uso de la reflexión para iterar sobre los miembros de datos estáticos de la clase R.raw para obtener los diversos nombres y valores de ID.

pero realmente no me ayuda a averiguar dónde existe la carpeta sin procesar.

Como carpeta, solo existe en su máquina de desarrollo. No es una carpeta en el dispositivo.

0

Desde un Context, puede llamar a algo como esto:

getResources().getAssets().list("thePath"); 

link to documentation

+1

Eso funciona para activos, y puede ser una mejor opción para el OP en este caso. Pero los activos no son lo mismo que los recursos brutos. – CommonsWare

+0

@Commons: Supongo que tenía la impresión de que todo en/res se consideraba un activo ... hmm ... –

+2

Los elementos se refieren a 'assets /', no 'res/raw /', la última vez que lo verifiqué. – CommonsWare

1

Puede utilizar AssetManager:

Por lo que yo puedo recordar, que tendrá lista con (justo Pruebe diferentes rutas):

final String[] allFilesInPackage = getContext().getResources().getAssets().list(""); 
+0

Solo funciona para/assets (?) – mmathieum

6

Este código va a recuperar todos los archivos de ' Nuevo Foder 'de sdCard.

File sdCardRoot = Environment.getExternalStorageDirectory(); 
    File yourDir = new File(sdCardRoot, "New Folder"); 
    for (File f : yourDir.listFiles()) { 
     if (f.isFile())   
     {    
      String name = f.getName();   
      Log.i("file names", name);   

     } 

    } 

y también asegurarse de añadir tarjeta SD androide permiso de escritura en el archivo de manifest.xml

Cuestiones relacionadas