【问题标题】:Android will not read/write fileAndroid不会读/写文件
【发布时间】:2016-03-08 20:42:10
【问题描述】:

我正在尝试读取文件,

/storage/emulated/0/proj/Assets/Images/Screens/Title.png

我可以清楚地看到该文件存在,我可以导航到该文件,我可以打开该文件,我验证了代码加载了该文件,但是在运行我收到的项目时,

03-08 15:34:44.415 22192 22209 E AndroidRuntime: com.badlogic.gdx.utils.GdxRuntimeException: Couldn't load file: /storage/emulated/0/proj/Assets/Images/Screens/Title.png
03-08 15:34:44.415 22192 22209 E AndroidRuntime:    at com.badlogic.gdx.graphics.Pixmap.<init>(Pixmap.java:140)
03-08 15:34:44.415 22192 22209 E AndroidRuntime:    at com.badlogic.gdx.graphics.TextureData$Factory.loadFromFile(TextureData.java:98)
03-08 15:34:44.415 22192 22209 E AndroidRuntime:    at com.badlogic.gdx.graphics.Texture.<init>(Texture.java:100)
03-08 15:34:44.415 22192 22209 E AndroidRuntime:    at com.badlogic.gdx.graphics.Texture.<init>(Texture.java:92)
03-08 15:34:44.415 22192 22209 E AndroidRuntime:    at com.badlogic.gdx.graphics.Texture.<init>(Texture.java:88)
03-08 15:34:44.415 22192 22209 E AndroidRuntime: Caused by: java.io.FileNotFoundException: /storage/emulated/0/proj/Assets/Images/Screens/Title.png
03-08 15:34:44.415 22192 22209 E AndroidRuntime:    at android.content.res.AssetManager.openAsset(Native Method)
03-08 15:34:44.415 22192 22209 E AndroidRuntime:    at android.content.res.AssetManager.open(AssetManager.java:313)
03-08 15:34:44.415 22192 22209 E AndroidRuntime:    at android.content.res.AssetManager.open(AssetManager.java:287)
03-08 15:34:44.415 22192 22209 E AndroidRuntime:    at com.badlogic.gdx.backends.android.AndroidFileHandle.read(AndroidFileHandle.java:75)
03-08 15:34:44.415 22192 22209 E AndroidRuntime:    ... 13 more

权限如下,

<uses-permission android:name="android.permission.RECORD_AUDIO"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.VIBRATE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>

这里是代码(从多个类合并)

public static File getBaseDirectory() { 
    return Gdx.files.external("proj").file();
}

private static File getAssetsDirectory() {
    File dir = new File(FileUtils.getBaseDirectory(), "Assets");
    dir.mkdirs();
    return dir;
}

private static File getImagesDirectory() {
    File dir = new File(getAssetsDirectory(), "Images");
    dir.mkdirs();
    return dir;
}

private static File getScreensDirectory() {
    File dir = new File(getImagesDirectory(), "Screens");
    dir.mkdirs();
    return dir;
}

public static Texture getScreen(String name) {
    File f = new File(getScreensDirectory(), name);
    return new Texture(f.getAbsolutePath()); //<--where it is failing
}

详情,

Phone: Nexus 5
Android Version: 6.0
compileSdkVersion: 21
targetSdkVersion: 21

写入日志文件的我自己的代码写入,

/storage/emulated/0/proj/log.txt

没有错误或问题。我编写的记录器类从与导致问题的代码相同的一组方法中获取位置。

File.exists() 读取它确实存在。

为什么 Android 会抛出 java.io.FileNotFoundException 而实际上确实存在?

【问题讨论】:

  • 您在哪个版本的 Android 上进行测试?另外,您的应用的targetSdkVersion 是什么?
  • @CommonsWare 我添加了 compileSdkVersion 但找不到 targetSdkVersion,我在哪里可以找到该信息?抱歉,我对使用 libgdx 和 Android 开发都很陌生。
  • 需要一些代码。你是在路径前指定file:// 吗?
  • 仅仅因为它存在,并不意味着你可以读取该文件。尝试检查权限。您是否还使用任何文件 API 来确认您可以与文件进行交互?像 File.exists() 一样?
  • 如果您使用的是 Android Studio,targetSdkVersion 通常在您的build.gradle 文件中。否则,请在清单中查找 &lt;uses-sdk&gt; 元素并在其中查找 android:targetSdkVersion 属性。

标签: java android libgdx filenotfoundexception


【解决方案1】:

您的代码(com.badlogic.gdx 是您的,对吗?)正在尝试使用 AssetManager.open() 打开文件。该方法用于打开打包为 您的 APK 中的资产 的文件。所以例外是说你的路径在你的 APK 的资产文件夹中不存在。

要使用直接路径打开文件,只需使用new FileInputStream(path)

【讨论】:

    【解决方案2】:

    libgdx Texture(String) 在 Android 上无法正常工作,此问题已通过更改解决,

    public static Texture getScreen(String name) {
        File f = new File(getScreensDirectory(), name);
        return new Texture(f.getAbsolutePath()); //<--where it is failing
    }
    

    到,

    public static Texture getScreen(String name) {
        File f = new File(getScreensDirectory(), name);
        return new Texture(Gdx.files.absolute(f.getAbsolutePath())); //<--where it was failing
    }
    

    【讨论】:

      【解决方案3】:

      我已经缩小了 PNG,我遇到了这个问题,然后当我尝试加载它们时,libgdx 因找不到相同的文件错误而死在我身上。

      libgdx 库对一些缩小的 PNG 有问题,所以如果你的 PNG 被压缩到 8 位,请尝试使用原始的。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-05-07
        • 2016-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-12-18
        • 2015-01-24
        相关资源
        最近更新 更多