Android中,SD卡上的媒体文件(图片、视频)的改变与通知
来源:互联网 发布:淘宝有逆战招打手的吗 编辑:程序博客网 时间:2024/06/04 08:54
转自:http://blog.csdn.net/jgdu1981/article/details/6771172
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同步媒体数据库。
建立连接
mConnection = new MediaScannerConnection(mContext, this);
因为建立连接是一个异步过程,所以,在建立连接时需要加入一个监听器。这样,连接建立后就可以得到通知,并进行下一步。
更新媒体数据库
mConnection.scanFile(mInfo.mFilename, mInfo.mMimetype);
这也是一个异步过程,更新完毕后,监听器中得到通知,并断开连接。
断开连接
mConnection.disconnect();
详细代码参考/packages/apps/Bluetooth下面BluetoothOppService.java中的MediaScannerNotifier这个类。
2、MediaScannerService,下载器DownloadProvider就是用的这种方式,当一个媒体文件下载完成后,直接绑定到MediaScannerService上,并调用mMediaScannerService.scanFile(info.mFileName, info.mMimeType);
这种方式比起上面的方式来,有两个缺点:
1、无法设置监听器。
2、scanFile本身是同步方法,扫描完成后才会返回,因此需要自己开一个新的线程来调用。
详细代码可以参考/packages/providers/DownloadProvider中DownloadService.java
任何一个应用程序,如果会更新SD卡上的媒体的话,都要记得使用上面两种方式中的一种来通知MediaProvider更新数据库。否则的话,用户打开Gallery是看不到我们的更新的。
MediaProvider中存在两个数据库一个是external对应文件系统为SD Card, 一个是内部数据库internal用于手机flash上的文件系统。遗憾的是虽然MediaProvider提供了操作内外两个数据库的功能,但在发布的应用中并没有使用这个内部文件系统。Android 默认状态下Image,audio等文件是保存在SD card上。External, internal 数据库都保存在手机文件系统上
Path: /data/data/com.android.providers.media/database/
如果要使用内部文件系统需要修改以下几个地方
1:MediaProvider generateFileName函数
java代码:
private String generateFileName(boolean internal, String preferredExtension, String directoryName)
{
// create a random file
String name = String.valueOf(System.currentTimeMillis());
if (internal) {
throw new UnsupportedOperationException("Writing to internal storage is not supported.");
// return Environment.getDataDirectory()
// + "/" + directoryName + "/" + name + preferredExtension;
} else {
return Environment.getExternalStorageDirectory()+ "/" + directoryName + "/" + name + preferredExtension;
}
}
恢复红色部分代码,将路径设置为手机内部文件系统文件夹。
2:保存文件使用的URI为content://media/internal/images/media/1红色internal表名使用内部文件系统数据库
3:修改Sqlite3_android.cpp中delete_file函数
java代码:
static void delete_file(sqlite3_context * context, int argc, sqlite3_value ** argv){
if (strncmp("/sdcard/", path, 8) != 0 && strncmp("/data/media/", path, 12)) {
sqlite3_result_null(context);
return;
}
}
添加红色部分,文件位于手机上/data/media路径时也进行删除。这样当我们从数据库里删除一条记录时,_data数据区存取的文件路径中的文件也将自动删除。
- Android中,SD卡上的媒体文件(图片、视频)的改变与通知
- Android中,SD卡上的媒体文件(图片、视频)的改变与通知
- Android中,SD卡上的媒体文件(图片、视频)的改变与通知
- Android中,SD卡上的媒体文件(图片、视频)的改变与通知
- Android中,SD卡上的媒体文件(图片、视频)的改变与通知
- Android中,SD卡上的媒体文件(图片、视频)的改变与通知
- android通过contentResolver删除SD卡上的媒体文件
- Android中显示sd卡的图片和视频
- android4.4上通知媒体文件更新的方式
- ImageView中显示SD卡上的图片或ImageView图片保存在SD卡上
- Android应用中在ImageView中显示SD卡上的图片
- Android应用中在ImageView中显示SD卡上的图片
- Android应用中在ImageView中显示SD卡上的图片
- android中通知系统扫描系统媒体文件的几种方法
- Android关于ListView显示SD卡上的Bitmap的图片(图片压缩之后)
- Android关于ListView显示SD卡上的Bitmap的图片(图片压缩之后)
- 【Android开发】经典范例1-在GridView中显示SD卡上的全部图片
- android如何读取sd卡上的图片到imageswitcher??
- python中 逗号的 用法
- python中 逗号的 用法
- ORACLE WHER条件的执行顺序是不是自右向左
- 博科资讯:C2B模式是未来电商及电商管理系统的发展之道
- 登陆框控件
- Android中,SD卡上的媒体文件(图片、视频)的改变与通知
- 2938: 字母旋转游戏
- 后台遍历一个HTML页面
- 设计模式在C中的应用方式
- .net的MSMQ异步调用
- 诊断
- 长沙降温8.5℃ 男子盗窃后杀害漂亮女白领
- [codility]FrogRiverOne
- 在xcode5中修改整个项目名