Android 的 MediaStore

最近在写一个类似微信的相册功能,需要读取照片和视频,支持多文件夹切换,且速度要比微信快。调研后发现基于 MediaStore 的方案最为合适。以前用得不多,特此记录。 ContentResolver 对 GROUP BY 的特殊处理 ContentResolver.query() 没有提供 groupBy 参数(与 SQLiteQueryBuilder.query() 不同),但可以通过在 selection 参数中嵌入 GROUP BY 来实现类似效果。 原理是 ContentResolver 会在编译 SQL 时给 selection 自动加上括号包裹,形成 WHERE ( ... )。利用这一点,可以在 selection 中提前闭合括号,然后追加 GROUP BY 子句。 1 2 3 4 5 6 // 常规写法 — selection 会被包装成 WHERE (mime_type IS NOT NULL) MediaStore.Images.ImageColumns.MIME_TYPE + " IS NOT NULL " // Hack 写法 — 利用闭合括号注入 GROUP BY MediaStore.Images.ImageColumns.MIME_TYPE + " IS NOT NULL " + ") GROUP BY (" + MediaStore.Images.ImageColumns.BUCKET_DISPLAY_NAME; 生成的 SQL 变为: ...

2017年3月31日 · 2 分钟 · haoxiqiang