Ответ 1
Передача пустой строки, похоже, работает на меня. Я получаю список файлов в моем каталоге ресурсов, когда я делаю следующее:
AssetManager aMan = appContext.getAssets();
String[] filelist = aMan.list("");
В моем приложении есть каталог ресурсов, в котором я сбросил кучу текстовых файлов, которые мне нужно загрузить во время выполнения.
У меня есть каталог, полный активов определенного типа (т.е. "активы/субдир" ), и я хочу загрузить все файлы в этом каталоге по одному.
У меня такой код:
AssetManager assetMgr = getAssets();
String[] assetsIWant = assetMgr.list("subdir");
for(String asset: assetsIWant) {
doAssetyThing(asset);
}
Я пробовал миллион различных версий параметра для assetMgr.list(), и я не получаю нигде.
Если я использую "/", я возвращаю список, содержащий каталог "assets", и несколько случайных других элементов (например, META_INF). Если я передаю любую другую строку (например, "активы" или "активы/" или "/активы" или "/активы/" или "mysubdir" или "/mysubdir" или "активы/mysubdir" или...), то я получаю назад пустой массив.
Документация, к сожалению, довольно бессвязная.
Кто-нибудь знает, какова правильная формула для этого параметра()?
Передача пустой строки, похоже, работает на меня. Я получаю список файлов в моем каталоге ресурсов, когда я делаю следующее:
AssetManager aMan = appContext.getAssets();
String[] filelist = aMan.list("");
Я использую следующий код, чтобы указать имя файла в активах /myFolder/:
String[] fileNames =getAssets().list("myFolder");
for(String name:fileNames){
System.out.println(name);
}
обратите внимание, что параметр в списке методов не содержит "/".
Я не уверен, почему он работает таким образом, но когда я перечисляю "/"
, я получаю материал корневого уровня, а не вещи из моего каталога "assets"
. На самом деле я не нашел способа правильно перечислить папку с моими ресурсами за короткое время, потраченное на попытки.
Обходной путь, который я использую, заключается в создании каталога "subdir"
внутри моего каталога "assets"
. Я помещаю все активы, которые хочу получить в этом "subdir"
, и делаю:
String[] assetsIWant = assetMgr.list("subdir");
Я не знаю, почему "/"
перечисляет сам каталог "assets"
как один из его файлов, но вам не нужно указывать каталог "assets"
при указании list
пути. Может быть, кто-то еще знает, но я надеюсь, что этот совет поможет вам в любом случае.
Когда вам нужно иметь доступ к папке, более глубокой в вашей иерархии, используйте
String[] fileNames =getAssets().list("myFolder"+File.separator+"mysubfolder");
вместо "/" внутри String, что даст вам пустой массив String в качестве результата.
В этой теме много подобных вопросов, я подозреваю, что вы используете папку с ресурсами в проекте библиотеки. если вы попытаетесь получить доступ к ресурсам в проекте библиотеки на андроиде, вы получите пустое содержимое и точные симптомы, которые вы описали здесь.
из документации по проектам android
источник: http://developer.android.com/tools/projects/index.html
Библиотечные проекты не могут включать исходные активы
Инструменты не поддерживают использование файлов исходных активов (сохраненных в каталоге assets/directory) в проект библиотеки. Любые ресурсы ресурсов, используемые приложением, должны быть хранится в каталоге assets/application самого прикладного проекта. Однако файлы ресурсов, сохраненные в каталоге res/, поддерживаются.
если это так, ответ заключается в том, что вы должны включать только Raw-активы в папку с ресурсами вашего проекта приложения НЕ в любом проекте, отмеченном как библиотека (вы можете проверить это, щелкнув правой кнопкой мыши ваш проект и выбрав свойства, выберите запись в андроиде слева и посмотрите флажок библиотеки)
Скажем, у вас установлена эта папка: 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
}
Я надеюсь, что это понятно и поможет вам!
Я использую следующие два метода, чтобы обеспечить наличие данного актива:
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;
}
}
Это решение работает для меня:
Сохраните копию каждого файла, к которому вы хотите получить доступ, из вспомогательной папки в каталоге ресурсов.
Используйте такое же соглашение. т.е. list("subdirectory")
Он не читает файлы в папке с ресурсами, но читает все "скопированные" файлы в своей подкаталоге. Weird!! Но работает!
По какой-то причине пустые каталоги не указаны.
По крайней мере, по моему опыту, они не указаны.
То есть, если у вас есть some-dir/d1/f1 и some-dir/d2 в области активов, и вы перечислите ( "some-dir" ), d2 не указан.