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 位,请尝试使用原始的。
我正在尝试读取文件,
/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 位,请尝试使用原始的。