Android, как я могу получить список всех файлов в папке?

Мне нужно имя (строка) всех файлов в res/raw/

Я пытался:

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

Похоже, что корневой каталог является корнем эмулятора Android... а не корневым каталогом моего компьютера. Это имеет достаточно смысла, но на самом деле не помогает мне узнать, где находится необработанная папка.

Обновление: спасибо за отличные ответы. Похоже, что некоторые из них работают, но только на полпути. Возможно, более подробное описание поможет

Я хочу получить все файлы mp3 в необработанной папке, чтобы я мог получить все имена, а затем добавить их в URI для воспроизведения случайного MP3 следующим образом...

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

Когда я помещаю «dennis.mp3» в папку с ресурсами, он отображается, как и ожидалось, однако, используя приведенный выше код, я больше не могу получить доступ к этому MP3, если только нет чего-то вроде:

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

person jasonsemko    schedule 30.06.2011    source источник
comment
Я подозреваю, что вы не можете ссылаться на необработанный актив по URI. Возможно, вам потребуется передать его как объект AssetFileDescriptor. Просто вызовите getResources().openRawResourceFd(resourceID);   -  person Captain Blammo    schedule 24.04.2013


Ответы (6)


Чтобы перечислить все имена ваших необработанных активов, которые в основном представляют собой имена файлов с удаленными расширениями, вы можете сделать это:

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

Поскольку фактические файлы не просто находятся в файловой системе после того, как они находятся на телефоне, имя не имеет значения, и вам нужно будет ссылаться на них по целому числу, присвоенному этому имени ресурса. В приведенном выше примере вы можете получить это целое число следующим образом:

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

Это то же самое int, которое вы получили бы, обратившись к R.raw.whateveryounamedtheresource.

person Captain Blammo    schedule 30.06.2011
comment
Спасибо! Делает именно то, что мне нужно :) - person jasonsemko; 01.07.2011
comment
Чтобы уточнить, используйте java.lang.reflect.Field[] - person Ryan Heitner; 02.01.2013
comment
@Captain Blammo, а как насчет каталога на хосте? Могу ли я получить список файлов в каталоге на хосте в Интернете? - person Behzad; 04.03.2013
comment
Нет, это совсем другая техника. Это только для локальных файлов внутри вашего каталога ресурсов во время компиляции. - person Captain Blammo; 04.03.2013
comment
Это не работает, если мы хотим перебрать класс R производного проекта. Любая идея о том, как бороться с таким аспектом? - person Mikaël Mayer; 02.10.2013
comment
@MikaëlMayer: передать в качестве параметра класс R производного проекта. Из-за того, как работает слияние ресурсов Android, только R производного проекта будет содержать сгенерированные поля. - person edovino; 14.10.2013
comment
Вы имеете в виду com.package.myderivedproject.R.raw.class? Но у меня нет доступа к com.package.myderivedproject в проекте базовой библиотеки. - person Mikaël Mayer; 14.10.2013

Этот код извлечет все файлы из «Нового файла» на SD-карте.

    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);          

        }

     }

а также обязательно добавьте разрешение на запись SD-карты Android в файл manifest.xml.

person Lucky Rana    schedule 02.01.2014

Мне нужно имя (строка) всех файлов в res/raw/

На устройстве нет файлов в res/raw/. Это ресурсы. Не существует хорошего способа перебора ресурсов, кроме использования отражения для перебора статических элементов данных класса R.raw для получения различных имен и значений идентификаторов.

но на самом деле не помогает мне узнать, где находится необработанная папка.

Как папка, она существует только на вашем компьютере для разработки. Это не папка на устройстве.

person CommonsWare    schedule 30.06.2011

Вы можете использовать AssetManager:

Насколько я помню, у вас будет список (просто попробуйте разные пути):

final String[] allFilesInPackage = getContext().getResources().getAssets().list("");
person Damian Kołakowski    schedule 30.06.2011

Посмотрите на http://developer.android.com/reference/android/content/res/Resources.html Обычно вы можете получить экземпляр Resources, связанный с вашим приложением, с помощью getResources().

Класс Resources предоставляет доступ к http://developer.android.com/reference/android/content/res/AssetManager.html (см. метод getAssets()). И, наконец, получите доступ к вашим упакованным (apk) файлам с помощью метода AssetManager.list(). Наслаждаться!

person abdolence    schedule 30.06.2011

Из Context вы можете вызвать что-то вроде этого:

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

ссылка на документацию

person nicholas.hauschild    schedule 30.06.2011
comment
Это работает для активов и может быть лучшим выбором для OP в этом случае. Но активы — это не то же самое, что сырьевые ресурсы. - person CommonsWare; 30.06.2011
comment
@Commons: я полагаю, у меня сложилось впечатление, что все, что находится в /res, считалось активом... хм... - person nicholas.hauschild; 30.06.2011
comment
Активы относятся к assets/, а не res/raw/, последнее, что я проверял. - person CommonsWare; 30.06.2011