在 android 但在 pc Build 上找不到资产文件 - libGDX
Asset File not found on android but on pc Build - libGDX
我还有一个问题。我目前正在开发我的下一款游戏,但遇到了一个大问题。
我可以通过自定义 AssetLoader 加载我的关卡描述文件,但前提是我为 PC 编译。在 Android 我得到了 "File not found Exception".
文件是:
assets/levels/merkur/level1.gbl
如前所述,在 PC 上我可以加载文件,在 android 上不能。我尝试了在 google 上找到的所有提示、重建、同步资产文件夹、重命名文件,但没有任何效果。
有
if (Gdx.files.internal("levels/merkur/level1.gbl").file().exists())
PC 为真,android 为假。
编辑:
资产管理器调用:
assetManager.load(Gdx.files.internal("levels/merkur/level1.gbl").path(), MissionLoader.class, new XMLMissionAssetLoader.MissionParameters());
assetManager.load(Gdx.files.internal("levels/merkur/level2.gbl").path(),MissionLoader.class,new XMLMissionAssetLoader.MissionParameters());
我的自定义加载器:
public class XMLMissionAssetLoader extends AsynchronousAssetLoader<MissionLoader, XMLMissionAssetLoader.MissionParameters> {
MissionLoader missionLoader;
public XMLMissionAssetLoader(FileHandleResolver resolver) {
super(resolver);
}
@Override
public void loadAsync(AssetManager manager, String fileName, FileHandle file, MissionParameters parameter) {
this.missionLoader = null;
this.missionLoader = new MissionLoader(fileName);
}
@Override
public MissionLoader loadSync(AssetManager manager, String fileName, FileHandle file, MissionParameters parameter) {
this.missionLoader = null;
this.missionLoader = new MissionLoader(fileName);
return missionLoader;
}
@SuppressWarnings("rawtypes")
@Override
public FileHandle resolve(String fileName) {
return super.resolve(fileName);
}
@Override
public Array<AssetDescriptor> getDependencies(String fileName, FileHandle file, XMLMissionAssetLoader.MissionParameters parameter) {
return null;
}
public static class MissionParameters extends AssetLoaderParameters<MissionLoader>
{
}
}
编辑 2:
此错误的完整日志:
W/System.err: java.io.FileNotFoundException: /levels/merkur/level1.gbl: open failed: ENOENT (No such file or directory)
W/System.err: at libcore.io.IoBridge.open(IoBridge.java:452)
W/System.err: at java.io.FileInputStream.<init>(FileInputStream.java:76)
W/System.err: at libcore.net.url.FileURLConnection.connect(FileURLConnection.java:123)
W/System.err: at org.apache.harmony.xml.parsers.DocumentBuilderImpl.parse(DocumentBuilderImpl.java:117)
W/System.err: at javax.xml.parsers.DocumentBuilder.parse(DocumentBuilder.java:183)
W/System.err: at com.cptnroughnight.apps.galaxyblast.GameState.MissionLoader.loadXML(MissionLoader.java:56)
W/System.err: at com.cptnroughnight.apps.galaxyblast.GameState.MissionLoader.<init>(MissionLoader.java:40)
W/System.err: at com.cptnroughnight.apps.galaxyblast.GameState.XMLMissionAssetLoader.loadAsync(XMLMissionAssetLoader.java:25)
W/System.err: at com.cptnroughnight.apps.galaxyblast.GameState.XMLMissionAssetLoader.loadAsync(XMLMissionAssetLoader.java:16)
W/System.err: at com.badlogic.gdx.assets.AssetLoadingTask.call(AssetLoadingTask.java:70)
W/System.err: at com.badlogic.gdx.assets.AssetLoadingTask.call(AssetLoadingTask.java:34)
W/System.err: at com.badlogic.gdx.utils.async.AsyncExecutor.call(AsyncExecutor.java:58)
W/System.err: at java.util.concurrent.FutureTask.run(FutureTask.java:237)
W/System.err: at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)
W/System.err: at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)
W/System.err: at java.lang.Thread.run(Thread.java:818)
W/System.err: Caused by: android.system.ErrnoException: open failed: ENOENT (No such file or directory)
W/System.err: at libcore.io.Posix.open(Native Method)
W/System.err: at libcore.io.BlockGuardOs.open(BlockGuardOs.java:186)
W/System.err: at libcore.io.IoBridge.open(IoBridge.java:438)
W/System.err: ... 15 more
W/System.err: java.io.FileNotFoundException: /levels/merkur/level1.gbl: open failed: ENOENT (No such file or directory)
W/System.err: at libcore.io.IoBridge.open(IoBridge.java:452)
W/System.err: at java.io.FileInputStream.<init>(FileInputStream.java:76)
W/System.err: at libcore.net.url.FileURLConnection.connect(FileURLConnection.java:123)
W/System.err: at org.apache.harmony.xml.parsers.DocumentBuilderImpl.parse(DocumentBuilderImpl.java:117)
W/System.err: at javax.xml.parsers.DocumentBuilder.parse(DocumentBuilder.java:183)
W/System.err: at com.cptnroughnight.apps.galaxyblast.GameState.MissionLoader.loadXML(MissionLoader.java:56)
W/System.err: at com.cptnroughnight.apps.galaxyblast.GameState.MissionLoader.<init>(MissionLoader.java:40)
W/System.err: at com.cptnroughnight.apps.galaxyblast.GameState.XMLMissionAssetLoader.loadSync(XMLMissionAssetLoader.java:31)
W/System.err: at com.cptnroughnight.apps.galaxyblast.GameState.XMLMissionAssetLoader.loadSync(XMLMissionAssetLoader.java:16)
W/System.err: at com.badlogic.gdx.assets.AssetLoadingTask.handleAsyncLoader(AssetLoadingTask.java:125)
W/System.err: at com.badlogic.gdx.assets.AssetLoadingTask.update(AssetLoadingTask.java:90)
W/System.err: at com.badlogic.gdx.assets.AssetManager.updateTask(AssetManager.java:504)
W/System.err: at com.badlogic.gdx.assets.AssetManager.update(AssetManager.java:378)
W/System.err: at com.cptnroughnight.apps.galaxyblast.GalaxyBlast.render(GalaxyBlast.java:243)
W/System.err: at com.badlogic.gdx.backends.android.AndroidGraphics.onDrawFrame(AndroidGraphics.java:459)
W/System.err: at android.opengl.GLSurfaceView$GLThread.guardedRun(GLSurfaceView.java:1648)
W/System.err: at android.opengl.GLSurfaceView$GLThread.run(GLSurfaceView.java:1353)
W/System.err: Caused by: android.system.ErrnoException: open failed: ENOENT (No such file or directory)
W/System.err: at libcore.io.Posix.open(Native Method)
W/System.err: at libcore.io.BlockGuardOs.open(BlockGuardOs.java:186)
W/System.err: at libcore.io.IoBridge.open(IoBridge.java:438)
W/System.err: ... 16 more
W/System.err: java.io.FileNotFoundException: /levels/merkur/level2.gbl: open failed: ENOENT (No such file or directory)
W/System.err: at libcore.io.IoBridge.open(IoBridge.java:452)
W/System.err: at java.io.FileInputStream.<init>(FileInputStream.java:76)
W/System.err: at libcore.net.url.FileURLConnection.connect(FileURLConnection.java:123)
W/System.err: at org.apache.harmony.xml.parsers.DocumentBuilderImpl.parse(DocumentBuilderImpl.java:117)
W/System.err: at javax.xml.parsers.DocumentBuilder.parse(DocumentBuilder.java:183)
W/System.err: at com.cptnroughnight.apps.galaxyblast.GameState.MissionLoader.loadXML(MissionLoader.java:56)
W/System.err: at com.cptnroughnight.apps.galaxyblast.GameState.MissionLoader.<init>(MissionLoader.java:40)
W/System.err: at com.cptnroughnight.apps.galaxyblast.GameState.XMLMissionAssetLoader.loadAsync(XMLMissionAssetLoader.java:25)
W/System.err: at com.cptnroughnight.apps.galaxyblast.GameState.XMLMissionAssetLoader.loadAsync(XMLMissionAssetLoader.java:16)
W/System.err: at com.badlogic.gdx.assets.AssetLoadingTask.call(AssetLoadingTask.java:70)
W/System.err: at com.badlogic.gdx.assets.AssetLoadingTask.call(AssetLoadingTask.java:34)
W/System.err: at com.badlogic.gdx.utils.async.AsyncExecutor.call(AsyncExecutor.java:58)
W/System.err: at java.util.concurrent.FutureTask.run(FutureTask.java:237)
W/System.err: at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)
W/System.err: at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)
W/System.err: at java.lang.Thread.run(Thread.java:818)
提前致谢!
如果您从 Android 应用中的资产加载,如果文件不存在,您将永远不会收到 FileNotFoundException。相反,您会得到一个 IOException。
由于您没有post您自定义的相关代码class我们无能为力。
您 os 可能没有在 MissionLoader
class 中使用正确的文件名。文件名是相对于文件存储位置的,在本例中为 Gdx.files.internal
。这通常位于 Android 上的 APK 内,或者在发布桌面版时位于 JAR 内。由于您可能是在桌面上调试(而不是打包到 JAR),它可能会在该平台上意外地为您工作。
你不能简单地使用文件名而不考虑存储类型。同样,您不能假定该文件是 os 文件系统上的物理文件。而是使用提供的 FileHandle
,其中包含您需要的所有信息,包括读取方法等。有关此的更多信息,请参阅 wiki:https://github.com/libgdx/libgdx/wiki/File-handling.
顺便说一句,您没有包含正确的代码片段。正确的片段应该是 com.cptnroughnight.apps.galaxyblast.GameState.MissionLoader.loadXML
方法的一部分,
在 MissionLoader.java
文件的 line 56
附近。您可以查看堆栈跟踪以获取此类信息。
另请注意,libgdx 附带了它自己的 XML reader/writer,您可能需要研究一下。另见:https://github.com/libgdx/libgdx/wiki/Reading-and-writing-XML.
好的,谢谢大家..我已经弄明白了。这确实是文件处理的错误用法。我也切换到 libGDX XML-parser 并且效果很好!
有时候只见树木不见森林!
我还有一个问题。我目前正在开发我的下一款游戏,但遇到了一个大问题。
我可以通过自定义 AssetLoader 加载我的关卡描述文件,但前提是我为 PC 编译。在 Android 我得到了 "File not found Exception".
文件是:
assets/levels/merkur/level1.gbl
如前所述,在 PC 上我可以加载文件,在 android 上不能。我尝试了在 google 上找到的所有提示、重建、同步资产文件夹、重命名文件,但没有任何效果。
有
if (Gdx.files.internal("levels/merkur/level1.gbl").file().exists())
PC 为真,android 为假。
编辑:
资产管理器调用:
assetManager.load(Gdx.files.internal("levels/merkur/level1.gbl").path(), MissionLoader.class, new XMLMissionAssetLoader.MissionParameters());
assetManager.load(Gdx.files.internal("levels/merkur/level2.gbl").path(),MissionLoader.class,new XMLMissionAssetLoader.MissionParameters());
我的自定义加载器:
public class XMLMissionAssetLoader extends AsynchronousAssetLoader<MissionLoader, XMLMissionAssetLoader.MissionParameters> {
MissionLoader missionLoader;
public XMLMissionAssetLoader(FileHandleResolver resolver) {
super(resolver);
}
@Override
public void loadAsync(AssetManager manager, String fileName, FileHandle file, MissionParameters parameter) {
this.missionLoader = null;
this.missionLoader = new MissionLoader(fileName);
}
@Override
public MissionLoader loadSync(AssetManager manager, String fileName, FileHandle file, MissionParameters parameter) {
this.missionLoader = null;
this.missionLoader = new MissionLoader(fileName);
return missionLoader;
}
@SuppressWarnings("rawtypes")
@Override
public FileHandle resolve(String fileName) {
return super.resolve(fileName);
}
@Override
public Array<AssetDescriptor> getDependencies(String fileName, FileHandle file, XMLMissionAssetLoader.MissionParameters parameter) {
return null;
}
public static class MissionParameters extends AssetLoaderParameters<MissionLoader>
{
}
}
编辑 2:
此错误的完整日志:
W/System.err: java.io.FileNotFoundException: /levels/merkur/level1.gbl: open failed: ENOENT (No such file or directory)
W/System.err: at libcore.io.IoBridge.open(IoBridge.java:452)
W/System.err: at java.io.FileInputStream.<init>(FileInputStream.java:76)
W/System.err: at libcore.net.url.FileURLConnection.connect(FileURLConnection.java:123)
W/System.err: at org.apache.harmony.xml.parsers.DocumentBuilderImpl.parse(DocumentBuilderImpl.java:117)
W/System.err: at javax.xml.parsers.DocumentBuilder.parse(DocumentBuilder.java:183)
W/System.err: at com.cptnroughnight.apps.galaxyblast.GameState.MissionLoader.loadXML(MissionLoader.java:56)
W/System.err: at com.cptnroughnight.apps.galaxyblast.GameState.MissionLoader.<init>(MissionLoader.java:40)
W/System.err: at com.cptnroughnight.apps.galaxyblast.GameState.XMLMissionAssetLoader.loadAsync(XMLMissionAssetLoader.java:25)
W/System.err: at com.cptnroughnight.apps.galaxyblast.GameState.XMLMissionAssetLoader.loadAsync(XMLMissionAssetLoader.java:16)
W/System.err: at com.badlogic.gdx.assets.AssetLoadingTask.call(AssetLoadingTask.java:70)
W/System.err: at com.badlogic.gdx.assets.AssetLoadingTask.call(AssetLoadingTask.java:34)
W/System.err: at com.badlogic.gdx.utils.async.AsyncExecutor.call(AsyncExecutor.java:58)
W/System.err: at java.util.concurrent.FutureTask.run(FutureTask.java:237)
W/System.err: at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)
W/System.err: at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)
W/System.err: at java.lang.Thread.run(Thread.java:818)
W/System.err: Caused by: android.system.ErrnoException: open failed: ENOENT (No such file or directory)
W/System.err: at libcore.io.Posix.open(Native Method)
W/System.err: at libcore.io.BlockGuardOs.open(BlockGuardOs.java:186)
W/System.err: at libcore.io.IoBridge.open(IoBridge.java:438)
W/System.err: ... 15 more
W/System.err: java.io.FileNotFoundException: /levels/merkur/level1.gbl: open failed: ENOENT (No such file or directory)
W/System.err: at libcore.io.IoBridge.open(IoBridge.java:452)
W/System.err: at java.io.FileInputStream.<init>(FileInputStream.java:76)
W/System.err: at libcore.net.url.FileURLConnection.connect(FileURLConnection.java:123)
W/System.err: at org.apache.harmony.xml.parsers.DocumentBuilderImpl.parse(DocumentBuilderImpl.java:117)
W/System.err: at javax.xml.parsers.DocumentBuilder.parse(DocumentBuilder.java:183)
W/System.err: at com.cptnroughnight.apps.galaxyblast.GameState.MissionLoader.loadXML(MissionLoader.java:56)
W/System.err: at com.cptnroughnight.apps.galaxyblast.GameState.MissionLoader.<init>(MissionLoader.java:40)
W/System.err: at com.cptnroughnight.apps.galaxyblast.GameState.XMLMissionAssetLoader.loadSync(XMLMissionAssetLoader.java:31)
W/System.err: at com.cptnroughnight.apps.galaxyblast.GameState.XMLMissionAssetLoader.loadSync(XMLMissionAssetLoader.java:16)
W/System.err: at com.badlogic.gdx.assets.AssetLoadingTask.handleAsyncLoader(AssetLoadingTask.java:125)
W/System.err: at com.badlogic.gdx.assets.AssetLoadingTask.update(AssetLoadingTask.java:90)
W/System.err: at com.badlogic.gdx.assets.AssetManager.updateTask(AssetManager.java:504)
W/System.err: at com.badlogic.gdx.assets.AssetManager.update(AssetManager.java:378)
W/System.err: at com.cptnroughnight.apps.galaxyblast.GalaxyBlast.render(GalaxyBlast.java:243)
W/System.err: at com.badlogic.gdx.backends.android.AndroidGraphics.onDrawFrame(AndroidGraphics.java:459)
W/System.err: at android.opengl.GLSurfaceView$GLThread.guardedRun(GLSurfaceView.java:1648)
W/System.err: at android.opengl.GLSurfaceView$GLThread.run(GLSurfaceView.java:1353)
W/System.err: Caused by: android.system.ErrnoException: open failed: ENOENT (No such file or directory)
W/System.err: at libcore.io.Posix.open(Native Method)
W/System.err: at libcore.io.BlockGuardOs.open(BlockGuardOs.java:186)
W/System.err: at libcore.io.IoBridge.open(IoBridge.java:438)
W/System.err: ... 16 more
W/System.err: java.io.FileNotFoundException: /levels/merkur/level2.gbl: open failed: ENOENT (No such file or directory)
W/System.err: at libcore.io.IoBridge.open(IoBridge.java:452)
W/System.err: at java.io.FileInputStream.<init>(FileInputStream.java:76)
W/System.err: at libcore.net.url.FileURLConnection.connect(FileURLConnection.java:123)
W/System.err: at org.apache.harmony.xml.parsers.DocumentBuilderImpl.parse(DocumentBuilderImpl.java:117)
W/System.err: at javax.xml.parsers.DocumentBuilder.parse(DocumentBuilder.java:183)
W/System.err: at com.cptnroughnight.apps.galaxyblast.GameState.MissionLoader.loadXML(MissionLoader.java:56)
W/System.err: at com.cptnroughnight.apps.galaxyblast.GameState.MissionLoader.<init>(MissionLoader.java:40)
W/System.err: at com.cptnroughnight.apps.galaxyblast.GameState.XMLMissionAssetLoader.loadAsync(XMLMissionAssetLoader.java:25)
W/System.err: at com.cptnroughnight.apps.galaxyblast.GameState.XMLMissionAssetLoader.loadAsync(XMLMissionAssetLoader.java:16)
W/System.err: at com.badlogic.gdx.assets.AssetLoadingTask.call(AssetLoadingTask.java:70)
W/System.err: at com.badlogic.gdx.assets.AssetLoadingTask.call(AssetLoadingTask.java:34)
W/System.err: at com.badlogic.gdx.utils.async.AsyncExecutor.call(AsyncExecutor.java:58)
W/System.err: at java.util.concurrent.FutureTask.run(FutureTask.java:237)
W/System.err: at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)
W/System.err: at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)
W/System.err: at java.lang.Thread.run(Thread.java:818)
提前致谢!
如果您从 Android 应用中的资产加载,如果文件不存在,您将永远不会收到 FileNotFoundException。相反,您会得到一个 IOException。
由于您没有post您自定义的相关代码class我们无能为力。
您 os 可能没有在 MissionLoader
class 中使用正确的文件名。文件名是相对于文件存储位置的,在本例中为 Gdx.files.internal
。这通常位于 Android 上的 APK 内,或者在发布桌面版时位于 JAR 内。由于您可能是在桌面上调试(而不是打包到 JAR),它可能会在该平台上意外地为您工作。
你不能简单地使用文件名而不考虑存储类型。同样,您不能假定该文件是 os 文件系统上的物理文件。而是使用提供的 FileHandle
,其中包含您需要的所有信息,包括读取方法等。有关此的更多信息,请参阅 wiki:https://github.com/libgdx/libgdx/wiki/File-handling.
顺便说一句,您没有包含正确的代码片段。正确的片段应该是 com.cptnroughnight.apps.galaxyblast.GameState.MissionLoader.loadXML
方法的一部分,
在 MissionLoader.java
文件的 line 56
附近。您可以查看堆栈跟踪以获取此类信息。
另请注意,libgdx 附带了它自己的 XML reader/writer,您可能需要研究一下。另见:https://github.com/libgdx/libgdx/wiki/Reading-and-writing-XML.
好的,谢谢大家..我已经弄明白了。这确实是文件处理的错误用法。我也切换到 libGDX XML-parser 并且效果很好!
有时候只见树木不见森林!