You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为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:

  1. 安装依赖:
pip install androidstorage4p
  1. 修改回调函数:
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 23:26:11