Подтвердить что ты не робот

Список активов в подкаталоге с помощью AssetManager.list

В моем приложении есть каталог ресурсов, в котором я сбросил кучу текстовых файлов, которые мне нужно загрузить во время выполнения.

У меня есть каталог, полный активов определенного типа (т.е. "активы/субдир" ), и я хочу загрузить все файлы в этом каталоге по одному.

У меня такой код:


AssetManager assetMgr = getAssets();

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

for(String asset: assetsIWant) {
  doAssetyThing(asset);
}

Я пробовал миллион различных версий параметра для assetMgr.list(), и я не получаю нигде.

Если я использую "/", я возвращаю список, содержащий каталог "assets", и несколько случайных других элементов (например, META_INF). Если я передаю любую другую строку (например, "активы" или "активы/" или "/активы" или "/активы/" или "mysubdir" или "/mysubdir" или "активы/mysubdir" или...), то я получаю назад пустой массив.

Документация, к сожалению, довольно бессвязная.

Кто-нибудь знает, какова правильная формула для этого параметра()?

4b9b3361

Ответ 1

Передача пустой строки, похоже, работает на меня. Я получаю список файлов в моем каталоге ресурсов, когда я делаю следующее:

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

Ответ 2

Я использую следующий код, чтобы указать имя файла в активах /myFolder/:

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

обратите внимание, что параметр в списке методов не содержит "/".

Ответ 3

Я не уверен, почему он работает таким образом, но когда я перечисляю "/", я получаю материал корневого уровня, а не вещи из моего каталога "assets". На самом деле я не нашел способа правильно перечислить папку с моими ресурсами за короткое время, потраченное на попытки.

Обходной путь, который я использую, заключается в создании каталога "subdir" внутри моего каталога "assets". Я помещаю все активы, которые хочу получить в этом "subdir", и делаю:

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

Я не знаю, почему "/" перечисляет сам каталог "assets" как один из его файлов, но вам не нужно указывать каталог "assets" при указании list пути. Может быть, кто-то еще знает, но я надеюсь, что этот совет поможет вам в любом случае.

Ответ 4

Когда вам нужно иметь доступ к папке, более глубокой в ​​вашей иерархии, используйте

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

вместо "/" внутри String, что даст вам пустой массив String в качестве результата.

Ответ 5

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

из документации по проектам android

источник: http://developer.android.com/tools/projects/index.html

Библиотечные проекты не могут включать исходные активы

Инструменты не поддерживают использование файлов исходных активов (сохраненных в каталоге assets/directory) в проект библиотеки. Любые ресурсы ресурсов, используемые приложением, должны быть хранится в каталоге assets/application самого прикладного проекта. Однако файлы ресурсов, сохраненные в каталоге res/, поддерживаются.

если это так, ответ заключается в том, что вы должны включать только Raw-активы в папку с ресурсами вашего проекта приложения НЕ в любом проекте, отмеченном как библиотека (вы можете проверить это, щелкнув правой кнопкой мыши ваш проект и выбрав свойства, выберите запись в андроиде слева и посмотрите флажок библиотеки)

Ответ 6

Скажем, у вас установлена ​​эта папка: Assets->SubDir1. У вас есть вещи в Subdir1 как A.txt, B.txt, C.txt. Поэтому из каталога Project это будет Assets/SubDir1/A.txt.

Учитывая это, способ доступа к этому файлу аналогичен тому, что вы делаете, добавляя одно. Это одно из ваших функций doAssetyThing. Вы должны поставить перед ним каталог Subdir1, даже если вы сделали фильтр "SubDir1" в .list("");

Пример:

    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
    }

Я надеюсь, что это понятно и поможет вам!

Ответ 7

Я использую следующие два метода, чтобы обеспечить наличие данного актива:

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

Ответ 8

Это решение работает для меня: Сохраните копию каждого файла, к которому вы хотите получить доступ, из вспомогательной папки в каталоге ресурсов. Используйте такое же соглашение. т.е. list("subdirectory")

Он не читает файлы в папке с ресурсами, но читает все "скопированные" файлы в своей подкаталоге. Weird!! Но работает!

Ответ 9

По какой-то причине пустые каталоги не указаны.

По крайней мере, по моему опыту, они не указаны.

То есть, если у вас есть some-dir/d1/f1 и some-dir/d2 в области активов, и вы перечислите ( "some-dir" ), d2 не указан.