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
相关产品推荐
相关产品推荐

