You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Godot 3.6安卓项目读取外部文件问题求助

解决Godot 3.6安卓文本文件读写问题

一、补全权限配置

你已经在导出选项中开启了读写权限,但安卓10及以上的分区存储机制会限制传统File API对公共存储的访问。需要在安卓项目的AndroidManifest.xml中添加兼容配置:
<application>标签内加入android:requestLegacyExternalStorage="true",强制使用旧的存储访问模式,这样才能直接读写公共目录下的文件。

如果使用Godot默认导出模板,可以通过以下方式修改:

  • 导出项目时勾选“自定义AndroidManifest”,导出后在生成的安卓项目中找到AndroidManifest.xml进行修改;
  • 或者提前修改Godot的安卓模板文件,后续导出时自动应用配置。

二、避免硬编码路径,使用系统API获取正确路径

不要直接写storage/xxx-xxx/books/texts这类硬编码路径,安卓不同设备的存储根路径可能存在差异,应该用Godot内置的OS.get_system_dir()方法获取标准路径:

  • 公共外部存储(所有应用可访问):OS.get_system_dir(OS.SYSTEM_DIR_EXTERNAL_STORAGE)
  • 应用私有外部存储(仅当前应用可访问,无需额外权限):OS.get_system_dir(OS.SYSTEM_DIR_EXTERNAL_DATA)

拼接目标路径示例:

# 公共存储下的books/texts目录
var target_dir = OS.get_system_dir(OS.SYSTEM_DIR_EXTERNAL_STORAGE) + "/books/texts"
# 目标文件路径
var target_file = target_dir + "/test.txt"

三、修正File类的读写逻辑

使用File.new()时,需要先确保目标目录存在,再进行读写操作,以下是完整示例:

读取文本文件

var file = File.new()
var target_file = OS.get_system_dir(OS.SYSTEM_DIR_EXTERNAL_STORAGE) + "/books/texts/test.txt"

# 递归创建目录(如果不存在)
var dir = Directory.new()
if not dir.dir_exists(target_file.get_base_dir()):
    dir.make_dir_recursive(target_file.get_base_dir())

# 读取文件内容
if file.file_exists(target_file):
    file.open(target_file, File.READ)
    var content = file.get_as_text()
    file.close()
    print("读取内容:", content)
else:
    print("目标文件不存在")

写入文本文件

var file = File.new()
var target_file = OS.get_system_dir(OS.SYSTEM_DIR_EXTERNAL_STORAGE) + "/books/texts/test.txt"

# 确保目录存在
var dir = Directory.new()
if not dir.dir_exists(target_file.get_base_dir()):
    dir.make_dir_recursive(target_file.get_base_dir())

# 写入内容
file.open(target_file, File.WRITE)
file.store_string("这是测试写入的文本内容")
file.close()
print("文件写入完成")

四、额外注意事项

  • 安卓13及以上系统,针对媒体文件有单独权限,但文本文件仍可通过READ_EXTERNAL_STORAGE/WRITE_EXTERNAL_STORAGE权限+legacy配置访问;
  • 若要访问应用私有内部存储,使用OS.get_system_dir(OS.SYSTEM_DIR_DATA),该路径仅当前应用可读写,无需额外权限。

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

火山引擎 最新活动