Android多媒体的删除

来源:互联网 发布:网络大屏广告机 编辑:程序博客网 时间:2024/05/22 10:52
                                                       Android多媒体的删除

    Android多媒体的存储在本地会存储一份,但是为了文件的管理,android有一个Mediastore的数据库,可以存放视频,音频,图片的详细信息,在开机或者插入sd卡时会触发系统广播对多媒体文件扫描,扫描后将相应的多媒体文件会在Mediastore中插入,供下次查询,这样文件管理就会很快。
   通过上述也就说明在删除android多媒体文件的时候一定要注意,不能仅仅使用File删除本地文件就完事儿的(如果多媒体已经保存到数据库),如果是这样数据库没删除就会导致在扫描目录的时候,该文件一直存在,但是点击会提示已经删除的现象,出现这种情况那么就需要删除数据库
   在删除数据库的时候有人可能对MediaScannerReceiver有所了解,所以就直接发个广播ACTION_MEDIA_SCANNER_SCAN_FILE,根据相应描述,ACTION_MEDIA_SCANNER_SCAN_FILE确实会对该文件进行一次扫描,所以就可以删除数据库,但是可能有人遇到其实数据是没有删除的,其实用ACTION_MEDIA_SCANNER_SCAN_FILE这种方法是不能删除数据库中的文件的,分析得知当前在onReceiver方法中只能提供两种扫描的接口:
scan()接口是带有prescan的,但是传入参数必须是volume的信息,也就是必须是整个storage;
scanFile()接口是不带prescan的,一般用于扫描单个文件或者文件夹(即传入参数是filepath类型的);而prescan的作用是把database原有的记录拿出来,如果不存在的文件,就标志为需要删除,在扫描结束的时候会将这些标记的记录删除掉。也就是不走prescan就无法删除,我们拿到ACTION_MEDIA_SCANNER_SCAN_FILE后,
首先响应的是MediaScannerService.handleScanSingleFile()方法:
packages/providers/MediaProvider/src/com/android/providers/media/MediaScannerService.java

private void handleScanSingleFile(Message msg) {
......
if (file.isDirectory()) {
scanFolder(new String[] {filePath}, MediaProvider.EXTERNAL_VOLUME);
} else {
uri = scanFile(filePath, arguments.getString("mimetype"));
}
注意:如果扫描的是文件夹,此处调用的是MediaScannerService.scanFolder()方法,如下:

private void scanFolder(String[] folders, String volumeName) {
......
MediaScanner scanner = createMediaScanner();
scanner.scanFolders(folders, volumeName, false);
} catch (Exception e) {
在该方法中会调用到MediaScanner.scanFolders()方法,如下:

frameworks/base/media/java/android/media/MediaScanner.java
public ArrayList scanFolders(String[] folders, String volume, boolean isSingelFileOrEmptyFolder) {
......
long lastModifiedSeconds = file.lastModified() / 1000;
mClient.doScanFile(folder, null, lastModifiedSeconds, file.length(),
file.isDirectory(), false, isNoMediaPath(folder));
在此处会调用到内部类的MyMediaScannerClient.doScanFile()方法;

private class MyMediaScannerClient implements MediaScannerClient {
public Uri doScanFile(String path, String mimeType, long lastModified,
请看,doScanFile方法中并没有prescan。

而frameworks/base/media/java/android/media/MediaScanner.java中的
scanSingleFile或者scanDirectories,都是实现了prescan,只是根据prescan的参数不同,然后去拼接的sql语句不同,所以他们扫描后可以删除数据库中的文件。
所以我们在删除多媒体文件的时候不仅要删除本地文件,也要删除数据库,但是删除数据库的时候不能发送扫描本地文件的广播去扫描文件夹,企图删除数据库中数据,这样是无效的,除非是发送扫描整盘的广播,但是这样效率低下,不好,最好是通过MediaProvider.delete直接将数据库中相应的字段删除,这样就比较高效了,到有1000多个视频或者图片,这样处理比较好,如果是再次扫描,这样费时耗资源,用户体验不好。

0 0
原创粉丝点击