SBIXENKDE 2025-02-01 13:58 采纳率: 100%
浏览 24
已结题

Godot4.3FileDialog到Android 11无法选择文件

问题描述: 在 Linux 上测试时,FileDialog 正常工作,可以列出文件。但是当我将项目导出到 Android 平台后,使用安卓11测试时 FileDialog 只列出了目录,而没有列出文件。我设置了 file_mode 为 MODE_OPEN_FILE,并将根目录设置为 /storage/emulated/0/。

请问是否有我遗漏的设置或需要额外考虑的权限,导致它在 Android 上无法显示文件?非常感谢您的帮助!

img

  • 写回答

3条回答 默认 最新

  • GISer Liu 2025-02-01 14:26
    关注

    该回答引用自GPT-deepseek, 由博主 GISer Liu 编写:

    问题分析

    在Godot 4.3中,FileDialog在Linux平台上正常工作,但在Android 11上却只能列出目录而无法列出文件。用户已经设置了file_modeMODE_OPEN_FILE,并将根目录设置为/storage/emulated/0/。问题可能出在以下几个方面:

    1. 权限问题:Android 11引入了更严格的存储权限管理,特别是对于访问外部存储(如/storage/emulated/0/)的权限。
    2. 文件访问API:Android 11引入了Scoped Storage,限制了应用对文件系统的直接访问。
    3. Godot的FileDialog实现:Godot的FileDialog在Android平台上可能需要额外的配置或权限才能正常工作。

    解决方案

    1. 检查并请求必要的权限

    在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)
    

    2. 使用Scoped Storage API

    Android 11引入了Scoped Storage,限制了应用对文件系统的直接访问。Godot的FileDialog可能需要适配Scoped Storage API才能正常工作。你可以尝试使用Storage Access Framework(SAF)来访问文件。

    3. 检查FileDialog配置

    确保FileDialog的配置正确,特别是file_moderoot目录的设置:

    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()
    

    4. 使用Godot的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类手动实现文件选择功能。

    参考文档

    希望这些解决方案能帮助你解决问题!如果有其他问题,欢迎继续提问。

    如果该回答解决了您的问题,请采纳!如果没有,请私信联系或评论您的疑惑

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 2月10日
  • 已采纳回答 2月2日
  • 创建了问题 2月1日