android - libGdx 无法在 android 应用程序数据目录中找到文件

标签 android file-io libgdx

我正在尝试从我的应用程序的数据目录访问数据。我能够加载 default.fnt 文件,但随后它告诉我找不到关联的 default.png如何让系统识别文件?是不是我设置有误?

异常

07-07 22:22:52.467: E/AndroidRuntime(10785): FATAL EXCEPTION: GLThread 240
07-07 22:22:52.467: E/AndroidRuntime(10785): com.badlogic.gdx.utils.GdxRuntimeException: Couldn't load file: /data/data/com.iliadonline.client/files/data/gfx/fonts/default.png
07-07 22:22:52.467: E/AndroidRuntime(10785):    at com.badlogic.gdx.graphics.Pixmap.<init>(Pixmap.java:140)
07-07 22:22:52.467: E/AndroidRuntime(10785):    at com.badlogic.gdx.graphics.glutils.FileTextureData.prepare(FileTextureData.java:64)
07-07 22:22:52.467: E/AndroidRuntime(10785):    at com.badlogic.gdx.graphics.Texture.load(Texture.java:175)
07-07 22:22:52.467: E/AndroidRuntime(10785):    at com.badlogic.gdx.graphics.Texture.create(Texture.java:159)
07-07 22:22:52.467: E/AndroidRuntime(10785):    at com.badlogic.gdx.graphics.Texture.<init>(Texture.java:133)
07-07 22:22:52.467: E/AndroidRuntime(10785):    at com.badlogic.gdx.graphics.Texture.<init>(Texture.java:126)
07-07 22:22:52.467: E/AndroidRuntime(10785):    at com.badlogic.gdx.graphics.g2d.BitmapFont.<init>(BitmapFont.java:125)
07-07 22:22:52.467: E/AndroidRuntime(10785):    at com.badlogic.gdx.graphics.g2d.BitmapFont.<init>(BitmapFont.java:99)
07-07 22:22:52.467: E/AndroidRuntime(10785):    at com.iliadonline.client.render.Render.loadFonts(Render.java:213)
07-07 22:22:52.467: E/AndroidRuntime(10785):    at com.iliadonline.client.render.Render.<init>(Render.java:71)
07-07 22:22:52.467: E/AndroidRuntime(10785):    at com.iliadonline.client.IliadClient.create(IliadClient.java:65)
07-07 22:22:52.467: E/AndroidRuntime(10785):    at com.badlogic.gdx.backends.android.AndroidGraphics.onSurfaceChanged(AndroidGraphics.java:322)
07-07 22:22:52.467: E/AndroidRuntime(10785):    at android.opengl.GLSurfaceView$GLThread.guardedRun(GLSurfaceView.java:1505)
07-07 22:22:52.467: E/AndroidRuntime(10785):    at android.opengl.GLSurfaceView$GLThread.run(GLSurfaceView.java:1240)
07-07 22:22:52.467: E/AndroidRuntime(10785): Caused by: com.badlogic.gdx.utils.GdxRuntimeException: Error reading file: /data/data/com.iliadonline.client/files/data/gfx/fonts/default.png (Internal)
07-07 22:22:52.467: E/AndroidRuntime(10785):    at com.badlogic.gdx.backends.android.AndroidFileHandle.read(AndroidFileHandle.java:74)
07-07 22:22:52.467: E/AndroidRuntime(10785):    at com.badlogic.gdx.files.FileHandle.readBytes(FileHandle.java:224)
07-07 22:22:52.467: E/AndroidRuntime(10785):    at com.badlogic.gdx.graphics.Pixmap.<init>(Pixmap.java:137)
07-07 22:22:52.467: E/AndroidRuntime(10785):    ... 13 more
07-07 22:22:52.467: E/AndroidRuntime(10785): Caused by: java.io.FileNotFoundException: /data/data/com.iliadonline.client/files/data/gfx/fonts/default.png
07-07 22:22:52.467: E/AndroidRuntime(10785):    at android.content.res.AssetManager.openAsset(Native Method)
07-07 22:22:52.467: E/AndroidRuntime(10785):    at android.content.res.AssetManager.open(AssetManager.java:315)
07-07 22:22:52.467: E/AndroidRuntime(10785):    at android.content.res.AssetManager.open(AssetManager.java:289)
07-07 22:22:52.467: E/AndroidRuntime(10785):    at com.badlogic.gdx.backends.android.AndroidFileHandle.read(AndroidFileHandle.java:72)
07-07 22:22:52.467: E/AndroidRuntime(10785):    ... 15 more

文件权限

我已经检查了文件是否存在以及它们是否具有正确的所有者/组,甚至将权限设置为 777 只是为了测试。

Shell Screen Shot

我已经看到其他几个问题,其中问题出在项目中的 assets 文件夹,但我没有使用 assets 文件夹。代码能够找到 .png 旁边的 .fnt 文件。


字体定义标题

info face="Droid Sans" size=17 bold=0 italic=0 charset="" unicode=0 stretchH=100 smooth=1 aa=1 padding=0,0,0,0 spacing=1,1 common lineHeight=20 base=18 scaleW=256 scaleH=128 pages=1 packed=0 page id=0 file="default.png" chars count=95


如果有帮助,这里是我用来获取文件句柄的代码:

FileHandle dataDir = Gdx.files.local("data");

FileHandle gfxDir = dataDir.child("gfx");
if(!gfxDir.isDirectory())
{
    //mkdirs will make all directories, so this includes the "data" dir
    gfxDir.mkdirs();
}

FileHandle spritesDir = gfxDir.child("sprites");
if(!spritesDir.isDirectory())
{
    spritesDir.mkdirs();
}

FileHandle fontsDir = gfxDir.child("fonts");
if(!fontsDir.isDirectory())
{
    fontsDir.mkdirs();
}

附言字体文件和 png 在 Assets 文件夹中时有效。所以我假设它们设置正确。

最佳答案

您遇到了来自 android.content.res.AssetManager.openFileNotFound 异常,但该文档明确指出它 only works with "files bundled as assets" .

但是,您不能直接调用它....

啊,Libgdx BitmapFont constructor使用 Gdx.files.internal 加载字体纹理:

public BitmapFont (BitmapFontData data, TextureRegion region, boolean integer) {
        this.region = region == null ? new TextureRegion(new Texture(Gdx.files.internal(data.imagePath), false)) : region;
        ...

(这似乎是 Libgdx 中的一个错误,假设字体纹理文件是“内部的”,但我不确定他们应该如何解决这个问题......)

我想你可以通过调用 the BitmapFont constructor that takes an explicit texture file 来解决这个问题在您的 loadFonts 方法中。

关于android - libGdx 无法在 android 应用程序数据目录中找到文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17513460/

相关文章:

Android:如何使键盘始终可见?

android - 以逗号作为小数点分隔符的 Masked EditText

android - 从远程 View 获取信息?

java - 在Java中读取文件时如何保留特殊符号?

android - 如何在 libgdx 的舞台上绘制位图字体?

java - libGDX wav 听起来像锯子

android - 适用于Android的Google云端硬盘SDK,将文件上传到Google云端硬盘时出现错误400错误请求

c - 使用 C 中的文件实现的 B 树(不是 B+/B*)中的问题

android - 无法在模拟器中读取SD卡中的文件

java - 调整文本按钮 LibGDX 的大小