You need to enable JavaScript to run this app. 使用Buildozer打包的Kivy应用如何在Android端用os.mkdir创建目录
优惠活动
大模型
产品
解决方案
定价
更多

使用Buildozer打包的Kivy应用如何在Android端用os.mkdir创建目录

Kivy+Buildozer打包Android应用os.mkdir()创建目录失效的原因与修复方案

为什么你的写法一直不生效

  • 直接运行os.mkdir("a")的写法在Android环境下完全失效:Android应用运行时没有PC端的可写公共根目录权限,相对路径默认指向应用沙箱内的临时受限目录,无权限写入时系统会直接拦截创建操作,不会弹出可见提示,你在手机文件管理器里自然找不到对应目录。
  • 拼接os.getcwd()路径执行创建也必然失败:Buildozer打包的Kivy应用默认工作目录指向APK内部的只读资源分区,这个路径从系统层面就是只读的,往里面拼接路径调用mkdir操作,无论你把这行代码放在导入Kivy之前还是之后执行,结果都是被拦截失败。
  • 单独导入os模块、调整代码执行顺序解决不了问题:核心矛盾不是Python代码的执行逻辑,是Android系统的存储权限模型和PC端Linux环境完全不同,默认状态下Kivy应用既没有申请存储权限,也不会自动暴露可写目录的真实路径。

可直接落地的修复步骤

  • 修改Buildozer配置文件,提前声明所需的存储权限:
    • 如果你只需要创建应用内部的私有目录,不需要用户在系统文件管理器里看到这个目录,不需要额外申请特殊权限,只要把目录创建在应用专属的私有路径下即可,这个路径是系统默认开放读写的,路径规则为/data/data/你的应用包名/files/,直接在这个路径下拼接自定义目录名执行os.makedirs(自定义路径, exist_ok=True),不会出现权限拦截。
    • 如果你需要创建用户可见的公共目录(比如存储下载文件、导出的文档),需要在Buildozer配置里声明WRITE_EXTERNAL_STORAGE、READ_EXTERNAL_STORAGE权限,同时适配Android 13以上的细粒度存储权限规则,并且在应用启动后动态向用户发起权限申请,不能直接用硬编码的存储路径执行创建。
  • 不要硬拼接外部存储路径:如果需要在公共存储区域创建目录,要通过PyJNIus调用Android系统的环境类获取真实的外部存储根路径,不要自己凭印象拼类似/sdcard/的硬编码路径,不同Android厂商的路径规则有差异,硬编码很容易拼错实际不存在的路径。
  • 排错时不要靠逐文件检索找目录:直接抓取应用运行的日志,os.mkdir()失败时一定会抛出权限不足、路径不存在的对应异常,Kivy打包后的默认配置会把未捕获的异常输出到系统日志,不抓日志很容易把“异常被拦截”误判为“目录没生成”。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.01 21:06:03