MediaProvider:媒体索引与扫描机制
2026/8/9大约 3 分钟存储与多媒体Android 14MediaProviderMediaStore扫描
MediaProvider:媒体索引与扫描机制
上一章看了访问模型。这一章回答:MediaStore 的数据从哪来,MediaProvider 如何扫描 与索引,FUSE 与媒体数据库是什么关系?
文件存在不等于索引已经建立
| 常见误解 | 正确理解 |
|---|---|
| MediaStore 是“文件列表” | 它是 MediaProvider 维护的媒体索引数据库 |
| 文件放进目录就自动出现在媒体库 | 需要扫描与索引,部分场景有延迟或遗漏 |
| MediaProvider 只服务媒体应用 | 图库、播放器、文件管理器都依赖它 |
核心结论
- MediaProvider 扫描外部存储并维护 MediaStore 数据库。
- 查询走 content URI,文件访问由 FUSE 提供。
- 扫描在媒体挂载、文件变化时触发。
- 文件存在但查不到:多为未索引、权限或扫描延迟。
- 图库/播放器都基于 MediaStore 查询。
扫描与查询主链
逐步解释:
- 写入:文件进入外部存储。
- 扫描:系统或 MediaStore 触发扫描。
- 索引:提取元数据写入数据库。
- 查询:应用通过 content URI 查询。
- 访问:FUSE 提供实际文件读写。
为什么“查不到”
常见原因:文件刚写入未扫描、目录不在扫描范围、权限不足、文件名/类型不被识别。 排查时先确认文件是否在磁盘,再查 MediaStore 是否有记录,最后看扫描日志。
源码证据
阅读目标:确认 MediaProvider 入口。
正文指针:packages/providers/MediaProvider/ 的扫描与数据库; MediaStore.java 的查询接口。
packages/providers/MediaProvider/ # 媒体索引服务这段代码证明: MediaProvider 是独立系统应用,负责索引与授权;MediaStore 是 客户端接口。
验证与排障
环境:开发设备或模拟器;以下命令不需要 root。
adb shell content query --uri content://media/external/images/media --projection _id:_display_name
adb shell dumpsys media_provider
adb logcat -v threadtime | grep -E "MediaProvider|MediaScanner"先查 MediaStore 记录,再看 MediaProvider 状态与扫描日志。文件在磁盘但查询不到时, 确认扫描是否完成、权限是否满足。
常见误区
- “MediaStore 就是文件系统”:是索引库。
- “放进去就有记录”:要扫描。
- “查不到就是文件没写”:可能未索引或权限问题。
- “只有图库用 MediaStore”:播放器、文件管理器都依赖。
延伸问题
- 媒体扫描的触发条件有哪些?
- MediaProvider 如何与 FUSE 协作授权访问?
- 大量文件时索引性能如何保障?
- 删除文件后索引如何清理?
源码入口
| 文件 | 关键位置 | 作用 |
|---|---|---|
packages/providers/MediaProvider/ | 服务实现 | 索引 |
MediaStore.java | 查询接口 | 客户端 |
MediaScanner | 扫描 | 元数据提取 |
dumpsys media_provider | 状态 | 排障 |
公共路径:packages/providers/MediaProvider/ 与 frameworks/base/media/java/android/provider/。行号以 r75 检索为准。
媒体数据之外的系统服务分工,见 Audio 与 Camera 服务。