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

Android 12下Kivy FileChooserListView文件访问权限被拒求助

Android 12下Kivy FileChooserListView权限问题解决

问题根源

Android 12(API 31)及以上的存储权限机制有重大变化:

  • 普通的READ_EXTERNAL_STORAGE/WRITE_EXTERNAL_STORAGE无法访问根目录等全局存储路径
  • MANAGE_EXTERNAL_STORAGE权限需要用户手动到系统设置开启,无法通过代码自动弹出权限请求
  • 你的FileChooserListView默认访问根目录/,因权限不足触发PermissionError,导致界面异常

解决方案

1. 修正Buildozer.spec配置

确保权限和目标API版本正确:

# 目标Android API版本(对应Android 12)
android.api = 31

# 权限配置
android.permissions = MANAGE_EXTERNAL_STORAGE, READ_EXTERNAL_STORAGE, WRITE_EXTERNAL_STORAGE

2. 修改Python代码

处理权限检查/跳转,并给FileChooser指定合法的初始路径:

from sys import platform
from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.filechooser import FileChooserListView

if platform == 'android':
    from android.permissions import check_permission, Permission
    from android.storage import primary_external_storage_path
    from android.intent import Intent
    from android.os import Build
    from pyjnius import autoclass
    import android.net.Uri

class MyLayout(BoxLayout):
    def __init__(self, **kwargs):
        super().__init__(**kwargs)
        self.orientation = 'vertical'
        # 初始化文件选择器,指定有权限的初始路径
        self.file_chooser = FileChooserListView()
        if platform == 'android':
            self.file_chooser.path = primary_external_storage_path()
        self.add_widget(self.file_chooser)

class k8(App):
    def build(self):
        if platform == 'android':
            self.check_storage_permission()
        return MyLayout()

    def check_storage_permission(self):
        if Build.VERSION.SDK_INT >= Build.VERSION_CODES.R:
            # 检查MANAGE_EXTERNAL_STORAGE权限
            if not check_permission(Permission.MANAGE_EXTERNAL_STORAGE):
                # 跳转至应用权限设置页面
                Intent = autoclass('android.content.Intent')
                Settings = autoclass('android.provider.Settings')
                pkg_name = self.get_running_app().package
                intent = Intent(Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION)
                intent.setData(Uri.parse(f"package:{pkg_name}"))
                self.activity.startActivity(intent)
        else:
            # 低版本系统请求读写权限
            from android.permissions import request_permissions
            request_permissions([Permission.READ_EXTERNAL_STORAGE, Permission.WRITE_EXTERNAL_STORAGE])

if __name__ == '__main__':
    k8().run()

3. 验证步骤

  1. 重新打包应用并安装到Android 12设备
  2. 首次启动时会自动跳转到应用权限设置页面,开启「允许管理所有文件」权限
  3. 返回应用后,FileChooser会正常加载外部存储目录,不再出现权限错误

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.04 20:13:09