Android(安卓)MediaScannerConnection,Android(安卓)MediaScannerConnectionClient
16lz
2021-01-26
本文转自严振杰的博客: http://blog.csdn.net/yanzhenjie1003
在Android4.4之前我们保存图片到SD卡用发送广播形式通知系统扫描图片,可以在最近的图片中查看到:
[java] view plain copy print ?
- /**
- * 保存后用广播扫描,Android4.4以下使用这个方法
- * @author YOLANDA
- */
- private void saveBroadcast(){
- String filePath = saveImg(true);
- sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.parse("file://" + filePath)));
- Toast.makeText(this, "保存成功:" + filePath, Toast.LENGTH_LONG).show();
- }
但是在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 ?
- /**
- * 实现MediaScannerConnection.MediaScannerConnectionClient
- * @author YOLANDA
- * @Time 2015年4月8日 上午9:03:54
- */
- public class MediaScanner implements MediaScannerConnection.MediaScannerConnectionClient {
- /**
- * 扫描对象
- */
- private MediaScannerConnection mediaScanConn = null;
- public MediaScanner(Context context) {
- //实例化
- mediaScanConn = new MediaScannerConnection(context, this);
- }
- /**文件路径集合**/
- private String[] filePaths;
- /**文件MimeType集合**/
- private String[] mimeTypes;
- /**
- * 扫描文件
- * @author YOLANDA
- * @param filepaths
- * @param mimeTypes
- */
- public void scanFiles(String[] filePaths, String[] mimeTypes) {
- this.filePaths = filePaths;
- this.mimeTypes = mimeTypes;
- mediaScanConn.connect();//连接扫描服务
- }
- /**
- * @author YOLANDA
- */
- @Override
- public void onMediaScannerConnected() {
- for (int i = 0; i < filePaths.length; i++) {
- mediaScanConn.scanFile(filePaths[i], mimeTypes[i]);//服务回调执行扫描
- }
- filePaths = null;
- mimeTypes = null;
- }
- private int scanTimes = 0;
- /**
- * 扫描一个文件完成
- * @author YOLANDA
- * @param path
- * @param uri
- */
- @Override
- public void onScanCompleted(String path, Uri uri) {
- scanTimes ++;
- if(scanTimes == filePaths.length) {//如果扫描完了全部文件
- mediaScanConn.disconnect();//断开扫描服务
- scanTimes = 0;//复位计数
- }
- }
- }
使用这个类的方法很简单:
[java] view plain copy print ?
- //扫描一个文件
- MediaScanner mediaScanner = new MediaScanner(context);
- String filePath = "sdcard/yolanda/scandemo.jpg";
- String fileMimeType = MimeTypeMap.getSingleton().getMimeTypeFromExtension("jpg");
- String[] filePaths = new String[]{filePath};
- String[] mimeTypes = new String[]{fileMimeType};
- mediaScanner.scanFiles(filePaths, mimeTypes);
- //扫描多个文件
- MediaScanner mediaScanner = new MediaScanner(context);
- String[] filePaths = new String[]{"sdcard/yolanda/scandemo1.jpg", "sdcard/yolanda/scandemo2.jpg", "sdcard/yolanda/scandemo3.jpg"};
- String fileMimeType = MimeTypeMap.getSingleton().getMimeTypeFromExtension("jpg");
- String[] mimeTypes = new String[]{fileMimeType};
- mediaScanner.scanFiles(filePaths, mimeTypes);
Demo源码: http://download.csdn.net/detail/yanzhenjie1003/8573229
更多相关文章
- Android(安卓)和 前端的类似点(持续更新)
- Android(安卓)Lint
- Android(安卓)自定义Notification字体颜色适配
- 系统定义弹窗以及自定义弹窗
- Android关于疑难bug处理方法之一(搜索不到相同bug解决方案)
- Android之CheckBox(多选按钮)
- Mac OS 上配置Android(安卓)studio的真机调试环境
- Android(安卓)view的移动和画布的移动原理 适用于制作各种效果
- Android(安卓)Local Service