web-dev-qa-db-ja.com

Android:アセットディレクトリからXMLファイルを読み込む方法

アセットディレクトリからxmlファイルをロードできません。同じコード行を使用して(パスを変更するだけで)異なる結果が得られます(okまたはNPE /ファイルが破損しています)。ファイル "castle1.tmx"(それはxmlファイルです)は2つの場所にコピーされます。

  • res/xml/castle1.tmx
  • assets/level/castle1.tmx

この行で動作します:

XmlResourceParser xrp = ctx.getAssets().openXmlResourceParser("res/xml/castle1.tmx");

この行ではそれはしません:

XmlResourceParser xrp = ctx.getAssets().openXmlResourceParser("assets/level/castle1.tmx");

次の結果が得られます。

04-05 21:46:40.940: WARN/ResourceType(29056): Bad XML block: header size 28024 or total size 1702240364 is larger than data size 70441
04-05 21:46:40.940: ERROR/TestParser(29056): Unable to read resource file
04-05 21:46:40.940: WARN/System.err(29056): Java.io.FileNotFoundException: Corrupt XML binary file
04-05 21:46:40.940: WARN/System.err(29056):     at Android.content.res.AssetManager.openXmlAssetNative(Native Method)
04-05 21:46:40.944: WARN/System.err(29056):     at Android.content.res.AssetManager.openXmlBlockAsset(AssetManager.Java:485)
04-05 21:46:40.944: WARN/System.err(29056):     at Android.content.res.AssetManager.openXmlResourceParser(AssetManager.Java:453)
04-05 21:46:40.944: WARN/System.err(29056):     at Android.content.res.AssetManager.openXmlResourceParser(AssetManager.Java:442)
04-05 21:46:40.944: WARN/System.err(29056):     at game.test.MapLoader.<init>(MapLoader.Java:73)

どちらの場合でもファイルが見つかります...その方法を使用してアセットディレクトリからファイルを読み取ることができないようです。

アセットディレクトリからXMLファイルをロードするにはどうすればよいですか?

tnx

16
freeaks

_res/_フォルダーではすべてのxmlファイルがプリコンパイルされますが、_assets/_フォルダーではプリコンパイルされません。そのため、プリコンパイルされていないリソースではopenXmlResourceParser()を使用できません。代わりにopen()を使用し、InputStreamからファイルを読み取ります。

18
GrAnd

アセットディレクトリ(assets/level/castle1.tmx)からXMLファイルを読み込んで解析することに成功しました

これが私がしたことです:

これを置き換えました:

  XmlResourceParser xrp = ctx.getResources().getXml(ctx.getResources().getIdentifier(name, "xml", ctx.getPackageName()));

これで:

  InputStream istr = context.getAssets().open("level/"+name+".tmx");
  XmlPullParserFactory factory = XmlPullParserFactory.newInstance(); 
  factory.setNamespaceAware(true); 
  xrp = factory.newPullParser(); 
  xrp.setInput(istr, "UTF-8");  

それから私がしなければならなかったすべてはいくつかのgetAttributeIntValue()行を編集することでした:

  int a = xrp.getAttributeIntValue(null, "width",0));

これに:

  int a = Integer.parseInt(xrp.getAttributeValue(null, "width"));

残りはすべて変更せずに動作しました:) ..このクラスは、タイル化されたxml/mapファイルを解析してゲームレベルを構築するためのものです。以前は、res /を使用して動作しましたが、代わりにすべてのファイルをアセット/に入れようとしました。だから今はうまくいきます:)

助けてくれてありがとう

16
freeaks

理由は、バイナリXMLファイルをロードしようとしているためです(エラーはJava.io.FileNotFoundException: Corrupt XML binary file)。

resに保存されているすべてのAndroid XMLファイル(レイアウト、文字列など))は、プロジェクトのコンパイル時に自動的にバイナリXMLにコンパイルされます。アセット内のXMLファイルは標準XMLとして扱われますファイルなどはバイナリXMLにコンパイルされません。

要約すると、Android XMLファイルはresフォルダーにある必要があります。レイアウトファイルなどではなく、assetsフォルダーにプレーンテキストのXMLのみを保存できます。

4
Joseph Earl

見て

https://github.com/pilhuhn/TurtleCar/blob/master/src/de/bsd/turtlecar/Board.Java#Lhttps:// github。 com/pilhuhn/TurtleCar/blob/master/src/de/bsd/turtlecar/SampleView.Java#L45

例として。

基本的には、AssetManagerにファイルを要求する必要があります。

 AssetManager assetManager = context.getAssets();
    try {
        InputStream is = assetManager.open("1.xml");
       ....
3
Heiko Rupp
    Resources resourcesForApplication = activity.getPackageManager().getResourcesForApplication(activity.getPackageName());
    AssetManager assets = resourcesForApplication.getAssets();
    InputStream xmlInputStream = assets.open("templates/horizontal/ybard/front/ybcard.xml");

    XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
    factory.setNamespaceAware(true);
    XmlPullParser parseXml = factory.newPullParser();

    parseXml.setInput(xmlInputStream ,"UTF-8");



    while ((eventType = parseXml.nextToken()) != XmlPullParser.END_DOCUMENT){

        if (eventType == XmlPullParser.START_TAG && parseXml.getName().equals("layers")) {

            String documentWidth = parseXml.getAttributeValue(0);
            String documentHeight = parseXml.getAttributeValue(1);
            ...
0
Stav Bodik