Android 不会 read/write 文件

Android will not read/write file

我正在尝试读取文件,

/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"/>

这是代码(从多个 classes 合并而来)

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

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

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

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

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

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

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
}

我在缩小 PNG 文件时遇到了这个问题,然后当我尝试加载它们时,libgdx 死于我,并出现相同的文件未找到错误。

libgdx 库在处理一些缩小的 PNG 时存在问题,因此如果您的 PNG 被压缩为 8 位,请尝试使用原始的。