Android 系统提供媒体库 URI 与 数据库的对应关系
前言
在 Android 系统中,本地媒体(e.g. 音乐)文件会被检索并且以 数据库
的形式进行保存管理,在开发 Android 程序的时候,我们可以使用 ContentProvider
设置 uri
去获取相关的数据1。
在使用 ContentProvider
组件的时候,通常的做法是继承父类 ContentProvider
,然后重载父类中 inser()
、 delete()
、 update()
、 query()
等方法实现对数据的操作2。
既然本地媒体文件在系统中是以 数据库
的形式来管理,并且提供了 uri
供我们使用,那么我猜在系统内部应该是有个 ***Provider
的去实现对 数据库
的操作。
通过 Google 和 Baidu 找到了相关名词——MediaProvider
,并且找到了源码3。
MediaProvider
public class MeidaProvider extends ContentProvider {
private static final Uri MEDIA_URI = Uri.parse("content://media");
private static final Uri ALBUMART_URI = Uri.parse("content://media/external/audio/albumart");
...
}
我想这个 MeidaProvider.class
也许会给我们想要的线索,因为使用 ContentResolver
获取本地音乐中,使用的 uri
为 content://media/external/audio/media
,而这个 class
也出现了类似的字段。
MeidaProvider extends ContentProvider
那么应该会 重载 ContentProvider
的相关方法以向外提供数据操作方法。而在查询音乐数据使用的方法为 query(Uri uri, ...)
传入一个 uri
,所以先查看 query( )
的内容。
query(Uri uri, …)
//MediaProvider.class:1813
public Cursor query(Uri uri, String[] projectionIn, String selection, String[] selectionArgs, String sort) {
int table = URI_MATCHER.match(uri);
...
String groupBy = null;
DatabaseHelper helper = getDatabaseForUri(uri);
...
<