使用Kivy在手机指定存储路径创建文件夹失败,求解决方案
解决Android创建App专属外部存储文件夹失败的问题
可能的原因及修复方案
1. 路径拼接错误
先检查primary_external_storage_path()的返回值是否正确,比如是否多了或漏了斜杠。如果它已经返回/storage/emulate/0,那拼接后的路径是对的,但如果返回值带结尾斜杠(比如/storage/emulate/0/),就会出现//Android/data...的无效路径。可以先打印路径确认:
target_path = str(primary_external_storage_path() + "/Android/data/org.app.test/folder") print(target_path)
2. 未递归创建目录
os.mkdir只能创建单级目录,如果父目录(比如org.app.test)不存在,就会创建失败。改用os.makedirs并设置exist_ok=True,它会递归创建所有需要的父目录,且目录已存在时不会报错:
import os target_path = str(primary_external_storage_path() + "/Android/data/org.app.test/folder") os.makedirs(target_path, exist_ok=True)
3. Android权限与版本适配
Android 10+(API 29及以上)
Scoped Storage机制下,App访问自己的Android/data/[包名]/目录不需要申请外部存储权限,但不建议硬编码路径,应该通过Context的API获取正确路径,避免路径适配问题:
# 假设你有Context实例(比如Activity或Application) external_files_dir = context.getExternalFilesDir(null) target_path = os.path.join(external_files_dir, "folder") os.makedirs(target_path, exist_ok=True)
getExternalFilesDir(null)会直接返回你的App专属存储目录(对应/storage/emulate/0/Android/data/org.app.test/files),在这个目录下创建子文件夹完全不需要权限,系统会自动保证访问权限。
Android 9及以下(API 28及以下)
需要在Manifest中声明权限:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
如果是API 23+(Android 6.0+),还需要在运行时动态请求这些权限,用户授权后才能创建目录。
4. 其他排查点
- 检查App是否被授予存储权限(在系统设置-应用-你的App-权限中查看)
- 确认存储设备有足够的空间
- 检查路径是否有特殊字符或权限限制(比如系统目录无法写入)
内容的提问来源于stack exchange,提问作者FrenchWatson
相关产品推荐
相关产品推荐

