Android MediaScannerConnection,Android MediaScannerConnectionClient

本文转自严振杰的博客:  http://blog.csdn.net/yanzhenjie1003

在Android4.4之前我们保存图片到SD卡用发送广播形式通知系统扫描图片,可以在最近的图片中查看到:

[java]  view plain  copy
 print ?
  1. /** 
  2.  * 保存后用广播扫描,Android4.4以下使用这个方法 
  3.  * @author YOLANDA 
  4.  */  
  5. private void saveBroadcast(){  
  6.     String filePath = saveImg(true);  
  7.     sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.parse("file://" + filePath)));  
  8.     Toast.makeText(this"保存成功:" + filePath, Toast.LENGTH_LONG).show();  
  9. }  

但是在Android4.4开始,系统广播权限被回收,我们不能发这个广播了,所以我们要使用Android MediaScannerConnection,Android MediaScannerConnectionClient来扫描图片,MediaScannerConnection不仅仅可以扫描图片,还可以扫描多媒体文件

仅仅需要简单的几步:

1、new一个MediaScannerConnection对象,这里需要一个实现了MediaScannerConnection.MediaScannerConnectionClient接口的类

2、传要扫描的文件路径和文件MimeType进来

3、调用MediaScannerConnection对象的connect()方法,会触发MediaScannerConnection.MediaScannerConnectionClient接口的onMediaScannerConnected方法

4、在MediaScannerConnection.MediaScannerConnectionClient接口的onMediaScannerConnected()方法内调用用MediaScannerConnection.scanFile(String path, String mimeType)来扫描文件

5、扫描结束后会触发MediaScannerConnection.MediaScannerConnectionClient接口的onScanCompleted方法,在这个方法里调用MediaScannerConnection.disconnect()断开连接

在这里我做了一个封装,我把源码贴上来:

[java]  view plain  copy
 print ?
  1. /** 
  2.  * 实现MediaScannerConnection.MediaScannerConnectionClient 
  3.  * @author YOLANDA 
  4.  * @Time 2015年4月8日 上午9:03:54 
  5.  */  
  6. public class MediaScanner implements MediaScannerConnection.MediaScannerConnectionClient {  
  7.   
  8.     /** 
  9.      * 扫描对象 
  10.      */  
  11.     private MediaScannerConnection mediaScanConn = null;  
  12.   
  13.     public MediaScanner(Context context) {  
  14.         //实例化  
  15.         mediaScanConn = new MediaScannerConnection(context, this);  
  16.     }  
  17.   
  18.     /**文件路径集合**/  
  19.     private String[] filePaths;  
  20.     /**文件MimeType集合**/  
  21.     private String[] mimeTypes;  
  22.   
  23.     /** 
  24.      * 扫描文件 
  25.      * @author YOLANDA 
  26.      * @param filepaths 
  27.      * @param mimeTypes 
  28.      */  
  29.     public void scanFiles(String[] filePaths, String[] mimeTypes) {  
  30.         this.filePaths = filePaths;  
  31.         this.mimeTypes = mimeTypes;  
  32.         mediaScanConn.connect();//连接扫描服务  
  33.     }  
  34.   
  35.     /** 
  36.      * @author YOLANDA 
  37.      */  
  38.     @Override  
  39.     public void onMediaScannerConnected() {  
  40.         for (int i = 0; i < filePaths.length; i++) {  
  41.             mediaScanConn.scanFile(filePaths[i], mimeTypes[i]);//服务回调执行扫描  
  42.         }  
  43.         filePaths = null;  
  44.         mimeTypes = null;  
  45.     }  
  46.   
  47.     private int scanTimes = 0;  
  48.   
  49.     /** 
  50.      * 扫描一个文件完成 
  51.      * @author YOLANDA 
  52.      * @param path 
  53.      * @param uri 
  54.      */  
  55.     @Override  
  56.     public void onScanCompleted(String path, Uri uri) {  
  57.         scanTimes ++;  
  58.         if(scanTimes == filePaths.length) {//如果扫描完了全部文件  
  59.             mediaScanConn.disconnect();//断开扫描服务  
  60.             scanTimes = 0;//复位计数  
  61.         }  
  62.     }  
  63. }  

使用这个类的方法很简单:

[java]  view plain  copy
 print ?
  1. //扫描一个文件  
  2. MediaScanner mediaScanner = new MediaScanner(context);  
  3. String filePath = "sdcard/yolanda/scandemo.jpg";  
  4. String fileMimeType = MimeTypeMap.getSingleton().getMimeTypeFromExtension("jpg");  
  5. String[] filePaths = new String[]{filePath};  
  6. String[] mimeTypes = new String[]{fileMimeType};  
  7. mediaScanner.scanFiles(filePaths, mimeTypes);  
  8.   
  9. //扫描多个文件  
  10. MediaScanner mediaScanner = new MediaScanner(context);  
  11. String[] filePaths = new String[]{"sdcard/yolanda/scandemo1.jpg""sdcard/yolanda/scandemo2.jpg""sdcard/yolanda/scandemo3.jpg"};  
  12. String fileMimeType = MimeTypeMap.getSingleton().getMimeTypeFromExtension("jpg");  
  13. String[] mimeTypes = new String[]{fileMimeType};  
  14. mediaScanner.scanFiles(filePaths, mimeTypes);  

Demo源码: http://download.csdn.net/detail/yanzhenjie1003/8573229


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值