2012-04-22 78 views
4

我正在寫一個朋友的小項目。記事卡應用程序。 我的計劃是將記錄卡放入xml格式,以便我可以輕鬆導入和導出它們。 我找到assets/xml/mynotecard.xml文件夾中的xml文件,但我無法設法訪問此文件。如何在我的android應用程序中訪問assets文件夾?

每當我嘗試解釋xml文件(稍後將放在它的類上)我得到的異常:test.xml不是一個文件。 這是我的代碼的摘錄:

公共類NotecardProActivity延伸活動{

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

}

將是真正真棒,如果你們能幫助我: )

回答

0

資產應該位於fol的根部der ...不能將文件放在子文件夾中。 資產\ file.suf會的工作,同時資產\子\ file.suf不會

+0

所以它會像/root/assets/xml/test.xml?另外,什麼是一個很好的解決方法?因爲我喜歡資產的文件夾結構,我不希望我的XML文件躺在res文件夾:( – dhartwich 2012-04-22 11:42:17

+0

編輯答案 – TacB0sS 2012-04-22 11:42:42

+0

沒有解決方案,據我所知...這是一個限制。另一個問題是,資產沒有在項目依賴關係中進行彙總,這意味着:如果您有一個包含資產的apklib,這些資產將不會彙總到依賴項目。 – TacB0sS 2012-04-22 11:44:55

0
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()); 
    } 
} 
+0

這讓你也在子文件夾中的文件? – TacB0sS 2012-04-22 12:56:24

+0

你需要什麼所有文件或單個文件? – 2012-04-22 12:57:23

+0

很想讓我的所有文件都在列表中,以便稍後當我需要將xml文件轉換爲字符串並將它們顯示在我的應用程序中時可用 – dhartwich 2012-04-22 13:32:44

2

郵編你的XML文件夾(xml.zip爲例),並把它的資產。使用AssetsManager獲取資產非常緩慢。另外,這樣做可以保持目錄結構,只需將其複製到SD卡並在其中提取即可。這將比獲取目錄中的每個文件快得多。你可以使用這個帖子解壓縮:How to unzip files programmatically in Android?。希望這可以幫助。

+0

你有沒有發現另一個解決方案呢?如果是這樣,你應該把它作爲答案。如果我的回答有幫助,如果您不介意,您能否將其標記爲已接受的答案? – Avezou 2015-11-05 00:08:18

相關問題