【问题标题】:How to access assets folder in my android app?如何访问我的 android 应用程序中的资产文件夹?
【发布时间】:2012-05-03 07:12:17
【问题描述】:

我正在为一个朋友写一个小项目。记事卡应用程序。 我的计划是将记事卡放在 xml 格式中,以便我可以轻松地导入和导出它们。 我在 assets/xml/mynotecard.xml 文件夹中找到了 xml 文件,但我无法访问该文件。

每当我尝试解释 xml 文件(稍后将在课堂上放入它)时,我都会遇到异常:test.xml 不是文件。 这是我的代码的摘录:

公共类 NotecardProActivity 扩展 Activity {

List<String> xmlFiles;
public ArrayList<File> xmlFileList;
XMLInterpreter horst;


/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

   final AssetManager mgr = getAssets();


    displayFiles(mgr, "",0); 
     xmlFiles = displayFiles(mgr, "xml",0); 
     for (int e = 0; e<=xmlFiles.size()-1;e++)
     {
        Log.v("Inhalt List"+e+": ", xmlFiles.get(e));
     }     

    xmlFileList = new ArrayList<File>();
    for (int i = 0; i<=xmlFiles.size()-1;i++)
    {

        xmlFileList.add(new File("./assets/xml/"+xmlFiles.get(i)));
    }
    for (int i = 0; i<=xmlFileList.size()-1;i++)
    {
        Log.v("Name: ", xmlFileList.get(i).getName());
        Log.v("Filelocation: ",xmlFileList.get(i).getPath());
        Log.v("Filelocation: ",xmlFileList.get(i).getAbsolutePath());               
    }
    Log.v("DEBUG","XML FILE LISTE erfolgreich geschrieben!");

    //Alternative zum ausgelagerten XML INTERPRETER
    try
    {
    if(xmlFileList.get(0) == null){
        Log.v("Debug", "XMLFILE IS NULL");
    }
    else{
    DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
    DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
    Document doc = dBuilder.parse(xmlFileList.get(0));
    doc.getDocumentElement().normalize();

    Log.v("Root element :", doc.getDocumentElement().getNodeName());
    NodeList nList = doc.getElementsByTagName("notecard");


    for (int temp = 0; temp < nList.getLength(); temp++) {

           Node nNode = nList.item(temp);
           if (nNode.getNodeType() == Node.ELEMENT_NODE) {

              Element eElement = (Element) nNode;    
              Log.v("GesetzesText: " , getTagValue("legal_text", eElement));
             // System.out.println("Kommentar : " + getTagValue("comment", eElement));                   
           }
        }
    }
    }
    catch (Exception e) {
        e.printStackTrace();
      }

    mgr.close();                
}


private List<String> displayFiles (AssetManager mgr, String path, int level) {
    List<String> abc = new ArrayList<String>();
    Log.v("Hello","enter displayFiles("+path+")");
   try {
       String list[] = mgr.list(path);
       abc.addAll(Arrays.asList(list));
        Log.v("Hello1","L"+level+": list:"+ Arrays.asList(list));

   } catch (IOException e) {
       Log.v("Fail","List error: can't list" + path);
   }
return abc;

}

private String getTagValue(String sTag, Element eElement) {
    NodeList nlList = eElement.getElementsByTagName(sTag).item(0).getChildNodes();

    Node nValue = (Node) nlList.item(0);

    return nValue.getNodeValue();
}

}

如果你们能帮助我,那就太棒了:)

【问题讨论】:

    标签: java android android-assets


    【解决方案1】:

    资产应该在文件夹的根目录中...不能将文件放在子文件夹中。 assets\file.suf 可以工作,而 assets\sub\file.suf 不能

    【讨论】:

    • 那么它会像 /root/assets/xml/test.xml 吗?另外,什么是一个好的解决方法?因为我喜欢资产的文件夹结构,我不希望我的 xml 文件放在 res 文件夹中:(
    • 据我所知没有解决方案......这是一个限制。另一个问题是资产没有聚合到项目依赖项中,这意味着:如果您有一个包含资产的 apklib,这些资产将不会聚合到依赖项目中。
    • 我该怎么做才能解决我的问题?有什么解决方法吗?
    • 没有我知道的解决方法。我刚刚使用了这些资产,尽其所能。
    • 我在之前的cmets中提到过。如果您压缩包含文件的目录结构,那么您可以将该压缩文件放在根目录(资产)中。然后您将从资产中读取一次(从资产管理器获取文件很慢),然后将其解压缩到设备上。解压相关信息可以查看here
    【解决方案2】:
    android.resource://packagename/assets/filename
    

    您可以使用上面的行来引用资产文件夹中的文件。 只需替换包名和文件名即可。

    注意文件名不能包含扩展名

    更新::

    private List<String> getFiles(){
     AssetManager assetManager = getAssets();
        List<String> files = null;
        try {
            files = assetManager.list("");
        } catch (IOException e) {
            Log.e("tag", e.getMessage());
        }
    } 
    

    【讨论】:

    • 这会让你也把文件放在子文件夹中?
    • 你需要所有文件还是单个文件?
    • 希望将我的所有文件放在一个列表中,以便以后在我需要将 xml 文件转换为字符串并在我的应用程序中显示它们时使用它们
    • 文件=assetManager.list("");不起作用-我将其更改为 files = Arrays.asList(assetManager.list(""));但现在我遇到的问题是它显示我的 xmls 以及图像、声音和 webkit。另外,如何将这些字符串转换为我的 xml 文件?
    • code ArrayList filesa = new ArrayList();列表 str = getFiles(); for (int i=0; icode 试过了,但现在我收到消息,无法找到协议:/
    【解决方案3】:

    压缩您的 xml 文件夹(例如 xml.zip)并将其放入资产中。使用 AssetsManager 获取资产非常慢。此外,这样做您可以维护您的目录结构,只需将其复制到 sdcard 并在那里解压即可。这比获取目录中的每个文件要快得多。您可以使用此帖子进行解压缩:How to unzip files programmatically in Android?。希望这会有所帮助。

    【讨论】:

    • 您找到解决此问题的其他方法了吗?如果是这样,你应该把它放在这里作为答案。如果我的回答有帮助,如果您不介意,能否将其标记为已接受的答案?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-14
    • 1970-01-01
    • 1970-01-01
    • 2019-05-10
    相关资源
    最近更新 更多