pydroid3 中文文档 下载 App

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 系统规则变了。