问题描述: 在 Linux 上测试时,FileDialog 正常工作,可以列出文件。但是当我将项目导出到 Android 平台后,使用安卓11测试时 FileDialog 只列出了目录,而没有列出文件。我设置了 file_mode 为 MODE_OPEN_FILE,并将根目录设置为 /storage/emulated/0/。
请问是否有我遗漏的设置或需要额外考虑的权限,导致它在 Android 上无法显示文件?非常感谢您的帮助!

问题描述: 在 Linux 上测试时,FileDialog 正常工作,可以列出文件。但是当我将项目导出到 Android 平台后,使用安卓11测试时 FileDialog 只列出了目录,而没有列出文件。我设置了 file_mode 为 MODE_OPEN_FILE,并将根目录设置为 /storage/emulated/0/。
请问是否有我遗漏的设置或需要额外考虑的权限,导致它在 Android 上无法显示文件?非常感谢您的帮助!

该回答引用自GPT-deepseek, 由博主 GISer Liu 编写:
在Godot 4.3中,FileDialog在Linux平台上正常工作,但在Android 11上却只能列出目录而无法列出文件。用户已经设置了file_mode为MODE_OPEN_FILE,并将根目录设置为/storage/emulated/0/。问题可能出在以下几个方面:
/storage/emulated/0/)的权限。FileDialog实现:Godot的FileDialog在Android平台上可能需要额外的配置或权限才能正常工作。在Android 11上,访问外部存储需要特定的权限。确保在AndroidManifest.xml中声明了以下权限:
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
此外,Android 11引入了MANAGE_EXTERNAL_STORAGE权限,用于访问所有外部存储文件。如果应用需要访问所有文件,可能需要请求此权限:
<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE"/>
在代码中动态请求权限:
func _ready():
if OS.get_name() == "Android":
if Engine.has_singleton("GodotAndroidPermissions"):
var permissions = ["android.permission.READ_EXTERNAL_STORAGE", "android.permission.WRITE_EXTERNAL_STORAGE"]
var permission = Engine.get_singleton("GodotAndroidPermissions")
permission.request_permissions(permissions)
Android 11引入了Scoped Storage,限制了应用对文件系统的直接访问。Godot的FileDialog可能需要适配Scoped Storage API才能正常工作。你可以尝试使用Storage Access Framework(SAF)来访问文件。
FileDialog配置确保FileDialog的配置正确,特别是file_mode和root目录的设置:
var file_dialog = FileDialog.new()
file_dialog.file_mode = FileDialog.FILE_MODE_OPEN_FILE
file_dialog.current_dir = "/storage/emulated/0/"
add_child(file_dialog)
file_dialog.popup_centered()
FileAccess类如果FileDialog在Android上仍然无法正常工作,可以考虑使用Godot的FileAccess类手动实现文件选择功能。你可以通过FileAccess类列出目录中的文件,并手动显示文件列表。
func list_files(path):
var files = []
var dir = Directory.new()
if dir.open(path) == OK:
dir.list_dir_begin()
var file_name = dir.get_next()
while file_name != "":
if not dir.current_is_dir():
files.append(file_name)
file_name = dir.get_next()
dir.list_dir_end()
return files
func _ready():
var files = list_files("/storage/emulated/0/")
for file in files:
print(file)
在Android 11上,FileDialog无法列出文件的问题可能是由于权限不足或Scoped Storage的限制。通过检查和请求必要的权限,并确保FileDialog的配置正确,可以解决这个问题。如果问题仍然存在,可以考虑使用FileAccess类手动实现文件选择功能。
希望这些解决方案能帮助你解决问题!如果有其他问题,欢迎继续提问。
如果该回答解决了您的问题,请采纳!如果没有,请私信联系或评论您的疑惑