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

如何使用Flet库访问手机相机并与其他系统组件交互?

Flet安卓开发:系统组件交互与权限配置问题解答

1. 相机使用:调用方式与依赖包

Flet目前没有原生的相机直接调用API,有两种可行方案:

  • 方案一:借助系统文件选择器间接调用相机
    利用Flet自带的FilePicker组件,设置选择图片类型,唤起系统文件选择器后,用户可选择“拍照”选项(系统原生相机入口)。这种方式不需要额外依赖,示例代码修改如下:
    import flet as ft
    import os
    import time
    
    def main(page: ft.Page): 
        page.title = "photo" 
        page.window_always_on_top = True
    
        # 创建文件选择器,用于选择图片/拍照
        def on_image_picked(e: ft.FilePickerResultEvent):
            if e.files:
                selected_file = e.files[0]
                # 复制文件到自定义目录
                save_dir = "/storage/emulated/0/Pictures/FletScreenshots"
                os.makedirs(save_dir, exist_ok=True)
                timestamp = int(time.time())
                file_name = f"screenshot_{timestamp}.png"
                file_path = os.path.join(save_dir, file_name)
                
                with open(selected_file.path, "rb") as src, open(file_path, "wb") as dst:
                    dst.write(src.read())
                
                page.image_container.controls.append(ft.Text(f"تم حفظ الصورة: {file_path}"))
                page.update()
    
        picker = ft.FilePicker(on_result=on_image_picked)
        page.overlay.append(picker)
    
        capture_button = ft.ElevatedButton(
            "التقاط صورة للشاشة", 
            on_click=lambda _: picker.pick_files(
                allow_multiple=False,
                file_type=ft.FilePickerFileType.IMAGE
            )
        )
    
        page.image_container = ft.Column()
        page.add(capture_button, page.image_container)
        page.scroll = "auto"
    
    ft.app(target=main)
    
  • 方案二:直接控制相机(自定义预览/拍照)
    如果需要更灵活的相机控制,需要引入第三方库plyer,它提供了跨平台的相机调用接口。安装命令:pip install plyer,然后在代码中调用:
    from plyer import camera
    
    def take_photo(e):
        try:
            photo_path = camera.take_picture()
            # 处理照片路径
            page.image_container.controls.append(ft.Text(f"تم حفظ الصورة: {photo_path}"))
            page.update()
        except Exception as ex:
            print(f"相机调用失败: {ex}")
    
    注意:打包安卓应用时,需要在AndroidManifest.xml中添加相机权限声明。

2. SYSTEM_ALERT_WINDOW权限配置(悬浮窗)

要实现应用悬浮于其他应用之上,需完成两步操作:

  1. 声明权限
    在安卓打包时,需要在AndroidManifest.xml中添加权限声明:
    <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
    
    如果你使用Flet官方的打包命令flet build android,可以在项目根目录创建android文件夹,放入自定义的AndroidManifest.xml,或者通过--android-manifest参数指定文件路径。
  2. 引导用户开启权限
    该权限属于安卓特殊权限,无法通过代码自动请求,必须引导用户跳转到系统设置页面开启。可以通过调用安卓的系统命令实现:
    import os
    
    def request_overlay_permission(e):
        # 替换为你的应用包名,比如com.example.fletapp
        package_name = "你的应用包名"
        os.system(f"am start -a android.settings.action.MANAGE_OVERLAY_PERMISSION -d package:{package_name}")
    
    添加一个按钮触发该函数,引导用户手动开启权限。另外,page.window_always_on_top = True在安卓上仅当悬浮窗权限开启后才会生效。

3. 权限请求:内置方法与第三方依赖

Flet对安卓权限的支持分为两种情况:

  • 常规权限(相机、存储等)
    Flet本身没有直接的权限请求API,推荐使用plyer库的权限模块来处理:
    from plyer import permissions
    
    def request_camera_permission(e):
        status = permissions.request('camera')
        if status == 'granted':
            # 权限已授予,执行相机操作
            print("相机权限已授予")
        else:
            print("相机权限被拒绝")
    
    同时需要在AndroidManifest.xml中提前声明对应权限:
    <uses-permission android:name="android.permission.CAMERA"/>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> <!-- 安卓13以下需添加 -->
    
  • 特殊权限(SYSTEM_ALERT_WINDOW、ACCESS_NOTIFICATION_POLICY等)
    这类权限无法通过代码直接请求,必须引导用户到系统设置页面手动开启,具体实现参考第2点的代码示例。

内容的提问来源于stack exchange,提问作者Dkil Dkil

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 02:50:13