アセットディレクトリからxmlファイルをロードできません。同じコード行を使用して(パスを変更するだけで)異なる結果が得られます(okまたはNPE /ファイルが破損しています)。ファイル "castle1.tmx"(それはxmlファイルです)は2つの場所にコピーされます。
この行で動作します:
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
_res/
_フォルダーではすべてのxmlファイルがプリコンパイルされますが、_assets/
_フォルダーではプリコンパイルされません。そのため、プリコンパイルされていないリソースではopenXmlResourceParser()
を使用できません。代わりにopen()
を使用し、InputStream
からファイルを読み取ります。
アセットディレクトリ(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 /を使用して動作しましたが、代わりにすべてのファイルをアセット/に入れようとしました。だから今はうまくいきます:)
助けてくれてありがとう
理由は、バイナリXMLファイルをロードしようとしているためです(エラーはJava.io.FileNotFoundException: Corrupt XML binary file
)。
res
に保存されているすべてのAndroid XMLファイル(レイアウト、文字列など))は、プロジェクトのコンパイル時に自動的にバイナリXMLにコンパイルされます。アセット内のXMLファイルは標準XMLとして扱われますファイルなどはバイナリXMLにコンパイルされません。
要約すると、Android XMLファイルはres
フォルダーにある必要があります。レイアウトファイルなどではなく、assetsフォルダーにプレーンテキストのXMLのみを保存できます。
見て
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");
....
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);
...