如何为Android平台的Flet应用获取文件保存权限?
解决Flet Android应用文件保存权限被拒问题
1. 配置Android权限声明
在项目根目录创建或编辑flet.toml文件,添加必要的存储权限,打包时Flet会自动将这些权限注入AndroidManifest.xml:
[android] permissions = [ "android.permission.WRITE_EXTERNAL_STORAGE", "android.permission.READ_EXTERNAL_STORAGE", # Android 13及以上版本需补充以下权限 "android.permission.READ_MEDIA_IMAGES", "android.permission.READ_MEDIA_VIDEO", "android.permission.READ_MEDIA_AUDIO" ]
2. 使用Flet原生文件保存API(推荐方案)
Android 10+引入的Scoped Storage机制限制了直接通过文件系统路径写入外部存储,即使获取文件夹路径也无法直接用open()写入。改用FilePicker.save_file()方法,让用户直接选择保存的文件路径,Flet会自动处理权限适配:
修改后的完整代码:
import flet as ft def main(page: ft.Page): def on_save_result(e: ft.FilePickerResultEvent): if e.path: try: with open(e.path, "w+", encoding="utf8") as fl: fl.write("Boo!") res = f"文件已保存至: {e.path}" except Exception as e: res = f"保存失败: {str(e)}" else: res = "用户取消了保存操作" pth.value = res page.update() save_file_picker = ft.FilePicker(on_result=on_save_result) page.overlay.append(save_file_picker) pth = ft.Text() page.add( ft.ElevatedButton( "选择保存位置并保存", on_click=lambda _: save_file_picker.save_file( dialog_title="选择保存路径", file_name="Test.txt", allowed_extensions=["txt"] ) ), pth, ) ft.app(target=main)
3. 保存到用户选择的文件夹(进阶方案)
如果必须保存到用户选定的文件夹而非指定文件,可使用androidstorage4p库处理SAF返回的文件夹URI:
- 安装依赖:
pip install androidstorage4p
- 修改回调函数:
import flet as ft from androidstorage4p import AndroidStorage def main(page: ft.Page): def on_dialog_result(e: ft.FilePickerResultEvent): folder_uri = e.path if not folder_uri: res = "用户取消选择" pth.value = res page.update() return try: storage = AndroidStorage() # 在选定文件夹创建并写入文件 file_uri = storage.create_file(folder_uri, "Test.txt") storage.write_file(file_uri, "Boo!".encode("utf8")) res = "文件已成功保存至选定文件夹" except Exception as e: res = str(e) pth.value = res page.update() file_picker = ft.FilePicker(on_result=on_dialog_result) page.overlay.append(file_picker) pth = ft.Text() page.add( ft.ElevatedButton("选择文件夹保存文件", on_click=lambda _: file_picker.get_directory_path()), pth, ) ft.app(target=main)
该方案仅适用于Android平台,打包时需确保依赖被正确打包进APK。
内容的提问来源于stack exchange,提问作者KMichael
相关产品推荐
相关产品推荐

