KivyMD创建目录遇PermissionError: [Errno 13]权限拒绝问题求助
Android 外部存储创建目录 PermissionError 解决指南
问题核心原因
Android 13(API 33)及以上版本彻底废弃了WRITE_EXTERNAL_STORAGE和READ_EXTERNAL_STORAGE权限对公共存储根目录的读写权限,即便你申请并获取了这些权限,直接在primary_external_storage_path()指向的公共根目录创建目录仍会被系统拦截,抛出PermissionError: [Errno 13] Permission denied。
具体解决办法
1. 适配Android 13+权限规则
若你需要操作媒体文件(图片、音频、视频):
- 在
buildozer.spec中添加对应媒体权限:android.permissions = READ_MEDIA_IMAGES, READ_MEDIA_VIDEO, READ_MEDIA_AUDIO - 代码中请求这些权限替代旧的存储权限:
request_permissions([Permission.READ_MEDIA_IMAGES, Permission.READ_MEDIA_VIDEO, Permission.READ_MEDIA_AUDIO])
- 在
若你要创建非媒体类目录:
Android 13+禁止在公共存储根目录创建自定义目录,建议改用应用专属外部存储目录,路径示例:path = os.path.join(primary_external_storage_path(), "Android", "data", "com.your.app.package", "files")该目录属于应用私有空间,无需额外权限即可读写,其他应用无法访问。
2. 修正权限请求逻辑
request_permissions是异步操作,必须等待权限授予完成后再执行目录创建,避免代码提前执行导致权限未生效:
import os from android.storage import primary_external_storage_path from android.permissions import request_permissions, Permission, check_permission def create_target_folder(): path = primary_external_storage_path() Folder = 'example' dire = os.path.join(path, Folder) # 先判断目录是否存在,避免重复创建报错 if not os.path.exists(dire): os.mkdir(dire) def on_permission_granted(permissions, grants): if all(grants): create_target_folder() # 先检查权限状态,未授予则请求 required_perms = [Permission.WRITE_EXTERNAL_STORAGE, Permission.READ_EXTERNAL_STORAGE] if not all(check_permission(p) for p in required_perms): request_permissions(required_perms, on_permission_granted) else: create_target_folder()
3. 更省心的替代方案:使用应用专属存储
如果不需要让其他应用访问你的目录,直接使用应用专属存储路径,完全绕开权限问题:
import os from android.storage import app_storage_path path = app_storage_path() Folder = 'example' dire = os.path.join(path, Folder) if not os.path.exists(dire): os.mkdir(dire)
4. Buildozer配置补充
确保buildozer.spec中指定了适配的Android API版本:
android.api = 33 android.minapi = 21
内容的提问来源于stack exchange,提问作者user21001211
相关产品推荐
相关产品推荐

