MediaProvider相当于一个数据中心SD卡上所有嘚数据在这里都有记录,而Gallery的什用就是展示和操作这个数据中心每次用户启动Gallery时,Gallery只是读取MediaProvider里面的记录并显示用户如果用户在Gallery里删除┅个媒体时,Gallery通过调用MediaProvider开放的接口来实现
MediaProvider和Gallery的大致关系就是这样的了。我现在碰到的问题要解决的话必须要搞清楚一件事才能继续往丅走:
因为Gallery启动时是不会给MediaProvider发送命令让它扫描全盘的。那么当SD卡上的数据有更新时(比如通过蓝牙接收一个媒体、从网上下载一个媒体、删除一个媒体等操作),MediaProvider如何知道这些变化然后更新自己的数据库的呢
在这里不考虑用户通过PC上的USB传输到SD卡上的问题。因为SD卡重新挂載时MediaProvider会自动扫描SD卡上的媒体来更新媒体数据库的。
那么只有一个答案了谁更新了SD卡上的媒体,谁通知MediaProvider把更新了的媒体同步到MediaProvider的媒体数據库中有两种方式,恰好蓝牙和下载器分别使用了这两种方式这里就以它们两个程序来说明一下。
1、MediaScannerConnection蓝牙传输文件时就是用的这种方式,每当接收到新的媒体文件都会通过这种方式告诉MediaProvider同步媒体数据库。
因为建立连接是一个异步过程所以,在建立连接时需要加入┅个监听器这样,连接建立后就可以得到通知并进行下一步。
这也是一个异步过程更新完毕后,监听器中得到通知并断开连接。
這种方式比起上面的方式来有两个缺点:
2、scanFile本身是同步方法,扫描完成后才会返回因此需要自己开一个新的线程来调用。
任何一个应鼡程序如果会更新SD卡上的媒体的话,都要记得使用上面两种方式中的一种来通知MediaProvider更新数据库否则的话,用户打开Gallery是看不到我们的更新嘚