You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

LibGDX游戏Android端创建assets目录下XML配置文件遇异常求助

嘿,这个问题我太熟了!你踩了LibGDX跨平台开发里一个很常见的坑——Android的assets目录是只读的,和桌面端完全不一样。

问题根源

桌面端运行时,assets是项目目录里的普通文件夹,你的代码可以直接创建子目录、写入文件;但Android平台打包后,assets里的内容会被打包进APK安装包,这个包是只读的,根本不允许写入操作,所以你才会抛出TransformerException这类IO相关的异常。

解决方案

给你两个实用的解决方向,按优先级推荐:

1. 用LibGDX自带的Preferences(最推荐)

这是LibGDX专门为跨平台配置存储设计的API,它会自动适配不同平台的存储规则,不用你手动处理路径和权限,代码也极简:

// 保存配置
Preferences prefs = Gdx.app.getPreferences("Ajustes");
prefs.putInteger("volumen", 80); // 比如音量设置
prefs.putBoolean("modoOscuro", true); // 深色模式
prefs.flush(); // 一定要调用flush才会写入磁盘

// 读取配置
int volumen = prefs.getInteger("volumen", 50); // 第二个参数是默认值
boolean modoOscuro = prefs.getBoolean("modoOscuro", false);

2. 手动指定可写的XML文件路径(如果一定要用XML)

如果你的业务逻辑必须用XML格式,那得把文件放到Android允许写入的目录,比如内部私有存储或外部存储:

内部私有存储(仅你的APP可访问,无需权限)

// 获取LibGDX封装的内部存储路径,直接创建文件
FileHandle configFile = Gdx.files.local("ajustes.xml");

// 接下来用你的XML生成逻辑写入这个文件,比如用Transformer:
TransformerFactory transformerFactory = TransformerFactory.newInstance();
Transformer transformer = transformerFactory.newTransformer();
DOMSource source = new DOMSource(你的XML文档对象);
StreamResult result = new StreamResult(configFile.write(false)); // false表示覆盖写入
transformer.transform(source, result);

外部存储(可被其他APP访问,需权限)

Android 6.0+需要动态申请读写权限,Android 13+还要注意分区存储规则:

if (Gdx.files.isExternalStorageAvailable()) {
    // 外部存储的自定义路径
    FileHandle configFile = Gdx.files.external("MiJuego/config/ajustes.xml");
    // 确保父目录存在
    configFile.parent().mkdirs();
    // 写入逻辑和上面一致
} else {
    // 外部存储不可用时, fallback到内部存储
    FileHandle fallbackFile = Gdx.files.local("ajustes.xml");
    // 写入逻辑
}
关键注意事项
  • 绝对不要尝试写入Android的assets目录,这是系统层面限制的,完全做不到
  • 优先用Preferences,它帮你规避了90%的跨平台存储坑
  • 如果用外部存储,记得在AndroidManifest.xml中添加权限(动态权限申请也要做好)

内容的提问来源于stack exchange,提问作者AwesomeGuy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 07:36:51