ti-enxame.com

Listar ativos em um subdiretório usando AssetManager.list

Meu aplicativo possui um diretório de ativos no qual despejei vários arquivos de texto que preciso carregar em tempo de execução.

Eu tenho um diretório cheio de ativos de um tipo específico (ou seja, "assets/subdir") e quero carregar todos os arquivos desse diretório, um de cada vez.

Eu tenho um código como este:


AssetManager assetMgr = getAssets();

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

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

Eu tentei um zilhão de versões diferentes do parâmetro para assetMgr.list () e não estou chegando a lugar nenhum.

Se eu usar "/", recebo de volta uma lista contendo o diretório "assets" e alguns outros itens aleatórios (META_INF, por exemplo). Se eu passar qualquer outra string (como "ativos" ou "ativos /" ou "/ ativos" ou "/ ativos /" ou "mysubdir" ou "/ mysubdir" ou "assets/mysubdir" ou ...), recebo de volta uma matriz vazia.

Infelizmente, a documentação é bastante incoerente.

Alguém sabe qual é a fórmula correta para esse parâmetro list ()?

42
Andrew Shelansky

Passar uma string vazia parece funcionar para mim. Eu recebo uma lista dos arquivos no meu diretório de ativos quando faço o seguinte:

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

Eu usei o seguinte código para listar o nome do arquivo em assets/myFolder /:

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

observe que o parâmetro na lista de métodos não contém "/".

27
David-mu

Quando você precisar acessar uma pasta mais abaixo em sua hierarquia, use

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

em vez de "/" dentro da String, o que forneceria uma matriz String vazia como resultado.

13
Robin

Não sei por que isso funciona dessa maneira, mas quando listo "/", Recebo coisas no nível raiz, não coisas do meu diretório "assets". Na verdade, não encontrei uma maneira de listar corretamente minha pasta de ativos no curto período de tempo que passei tentando.

A solução alternativa que estou usando é criar um diretório "subdir" Dentro do meu diretório "assets". Coloquei todos os ativos que desejo acessar neste "subdir" E faço:

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

Não sei por que "/" Lista o diretório "assets" Como um de seus arquivos, mas você não precisa especificar o diretório "assets" Ao fornecer list um caminho. Talvez alguém saiba, mas espero que essa dica o ajude de qualquer maneira.

12
Hostile

Existem muitas perguntas semelhantes sobre esse tópico, suspeito que você esteja usando a pasta assets em um projeto de biblioteca. se você tentar acessar ativos em um projeto de biblioteca em Android, obterá conteúdo vazio e os sintomas exatos que você descreveu aqui

da documentação Android "projetos"

source: http://developer.Android.com/tools/projects/index.html

Os projetos de biblioteca não podem incluir ativos brutos

As ferramentas não suportam o uso de arquivos de ativos brutos (salvos no diretório assets /) em um projeto de biblioteca. Quaisquer recursos de ativos usados ​​por um aplicativo devem ser armazenados no diretório/ativos do próprio projeto do aplicativo. No entanto, os arquivos de recursos salvos no diretório res/são suportados.

se for esse o caso, a resposta é que você deve incluir apenas os recursos brutos na pasta de ativos do seu projeto de aplicativo [~ # ~] not [~ # ~] em qualquer projeto marcado como library (você pode verificar isso clicando com o botão direito do mouse em seu projeto e selecionando propriedades, marque a entrada Android à esquerda e veja a caixa de seleção is library)

6
Matt

Digamos que você tenha esta pasta configurada: Assets->SubDir1. Você tem coisas em Subdir1 Como A.txt, B.txt, C.txt. Portanto, no diretório do projeto, seria Assets/SubDir1/A.txt.

Levando isso em conta, a maneira de acessar esse arquivo é semelhante ao que você está fazendo, adicionando uma coisa. Essa coisa está na sua função doAssetyThing. Você precisa colocar o diretório SubDir1 Na frente dele, mesmo se tiver feito um filtro de "SubDir1" No diretório .list("");

Exemplo:

    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 isso esteja claro e ajude você!

3
Steven_BDawg

Eu uso os dois métodos a seguir para garantir a presença de determinado ativo:

    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;
    }
}
2
32kda

Esta solução parece funcionar para mim: mantenha também uma cópia de cada arquivo que você deseja acessar de um subdiretório no diretório de ativos. Use a mesma convenção. ou seja, list("subdirectory")

Ele não lê os arquivos na pasta assets, mas lê todos os arquivos "copiados" em seu subdiretório. Esquisito!! Mas funciona!

1
Andro

Por algum motivo, diretórios vazios não são listados.

Pelo menos, na minha experiência, eles não estão listados.

Ou seja, se você tiver algum-dir/d1/f1 e algum-dir/d2 na área de ativos e listar ("some-dir"), d2 não será listado.

1
Richard Sharpe