本文转自严振杰的博客:  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


更多相关文章

  1. Android(安卓)和 前端的类似点(持续更新)
  2. Android(安卓)Lint
  3. Android(安卓)自定义Notification字体颜色适配
  4. 系统定义弹窗以及自定义弹窗
  5. Android关于疑难bug处理方法之一(搜索不到相同bug解决方案)
  6. Android之CheckBox(多选按钮)
  7. Mac OS 上配置Android(安卓)studio的真机调试环境
  8. Android(安卓)view的移动和画布的移动原理 适用于制作各种效果
  9. Android(安卓)Local Service

随机推荐

  1. 如何展现Activity Indicator
  2. android 取消RTC闹钟程序
  3. EditText中inputType="number"还可输入字
  4. Compile, Install, Run Linux Apps on An
  5. Intents and IntentFilters
  6. Initializing a Build Environment
  7. Build android development platform in
  8. Android(安卓)ADB命令大全
  9. adb top 指令,查看系统进程
  10. New Work Style - Mobile Smart Setting