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




