Android 11+ 分区存储 —— 为什么某些目录读不到
问题根源
Android 11(API 30)开始强制实施分区存储(Scoped Storage)——App 只能访问自己专属目录和几个公共区域(图片、视频、下载),不能随便读写内部存储根目录下的任意文件夹。
Pydroid 作为一个在 Android 上运行的 App,受这个规则约束。如果你把脚本文件放到了 Pydroid 访问权限外的目录,Pydroid 里用 open("xxx.py") 会报错。
Pydroid 能访问的目录
| 目录 | 权限 |
|---|---|
App 私有目录(data/ru.iiec.pydroid3/files/) | ✅ 完全自由读写 |
/sdcard/Documents/Pydroid3/ | ✅ 公共 Documents 区域,Pydroid 专属文件夹,完全自由 |
/sdcard/Download/ | ⚠️ Android 11+ 下访问受限,可能需要额外权限 |
| 其他 App 的私有目录 | ❌ 绝对不能 |
| 内部存储根目录下任意位置 | ❌ 绝对不能 |
| 外部 SD 卡 | ❌ Android 11+ 基本不可用 |
正确的做法
把你的代码文件统一放在 /sdcard/Documents/Pydroid3/(或 Pydroid App 私有目录的某个子文件夹)。Pydroid 自己也建议这么做——这是唯一保证能读写、又能被其他 App 看到的公共路径。
常见报错与解决
报错:FileNotFoundError: [Errno 2] No such file or directory: '/storage/emulated/0/some-folder/'
说明你代码里 open() 的路径指向了 Pydroid 访问不了的目录。把文件移到 Documents/Pydroid3/ 下,或者改用 App 私有目录下的路径。
报错:PermissionError: [Errno 1] Operation not permitted
Android 11+ 分区存储典型报错。你需要把文件挪位置,没有办法绕过分区存储(除非给 Pydroid root 权限,这超出了普通用户的范围)。
报错:os.listdir() 能列出文件夹但文件列表为空
某些 Android 11 设备上,Pydroid 能列出受限目录的文件夹结构但看不到文件。这是 Android 系统故意的——目录可见性 ≠ 文件可读性。
怎么快速确认某个目录能不能用
在 Pydroid Terminal 里试一下:
python -c "import os; print(os.listdir('Documents/Pydroid3'))"
如果能正常打印内容,这个路径就是可用的。报错的话换路径。
历史背景说明
Pydroid 的旧版本(Android 10 及之前)里,open() 可以访问几乎所有内部存储路径。Android 11 强制开启分区存储后,旧代码里指向任意路径的脚本都会开始报权限错误——这不是你的代码坏了,是 Android 系统规则变了。