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. 验证步骤
- 重新打包应用并安装到Android 12设备
- 首次启动时会自动跳转到应用权限设置页面,开启「允许管理所有文件」权限
- 返回应用后,FileChooser会正常加载外部存储目录,不再出现权限错误
内容的提问来源于stack exchange,提问作者sleepy
相关产品推荐
相关产品推荐

