Android MediaScannerConnection扫描文件
在 Android 4.4 之后,ACTION_MEDIA_MOUNTED 这个广播只能由系统发出,APP 只能监听,不能广播,所以通过发送广播的方式来让系统扫描文件的做法已经是走不通了。在 4.4 以后,会因为权限不够抛出运行时异常
MediaScannerConnection
Android 认为,使用 MediaScannerConnection 会更加廉价,也就是系统的开销少。
1、如果是通过广播 ACTION_MEDIA_MOUNTED 的话,很多 APP 都会直接广播一个目录,于是系统就一直在扫描整个目录。而 MediaScannerConnection 每次只能扫描一个文件,这样的约束条件可能一定程度上能减少扫描的次数和个数。
2、 MediaScannerConnection 使用了比 ACTION_MEDIA_MOUNTED 更高效或更轻便的实现。
MediaScannerConnection 两种使用方式
1、创建MediaScannerConnection对象,调用scanFile() 方法。
public void scanFile(String path, String mimeType),
创建MediaScannerConnection对象的时候需要实现 MediaScannerConnection.MediaScannerConnectionClient接口,这个接口只有两个方法。在调用MediaScannerConnection.connect()方法后,MediaScannerConnectionClient接口的onMediaScannerConnected()方法会被回调,然后就可以调用 MediaScannerConnection.scanFile(String,String)方法了。在扫描完成后,MediaScannerConnectionClient的方法onScanCompleted(String path, Uri uri)会被回调,在这个方法里,一般调用MediaScannerConnection.disconnect()方法。
这个方法一次只能扫描一个文件,path 必须是一个具体的文件,不能是目录。在创建一个MediaScannerConnection对象后,如果要多次调用 scanFile() 方法,就不要在onScanCompleted() 方法里调用disconnect()方法。
2、使用 MediaScannerConnection.scanFile() 静态方法。
public static void scanFile(Context context, String[] paths, String[] mimeTypes, OnScanCompletedListener callback)
这是一个静态方法,使用就比较简单了。OnScanCompletedListener 可实现可不实现,它只有一个方法,在扫描完成的时候回调。scanFile 静态方法可以一次传递多个文件,如果 mimeTypes 不为空,就必须于 paths 的长度一致。mimeTypes 可以为空。
MimeType 的选择。
如果 MimeType ,将会使用文件的后缀名来判断文件的类型,但是千万别用 / ,我以为使用这个它会自动判断文件的类型的,结果不是这样子的。使用 / 的结果就是扫描完成后,相册里的东东全部没有出现在 MediaStore 里,也就是没有被当成多媒体文件扫描进多媒体数据库里。
完成代码
package com.huahan.lovebook.utils;import java.io.File;import com.huahan.hhbaseutils.HHLog;import android.content.Context;
import android.media.MediaScannerConnection;
import android.net.Uri;public class MediaScanner {private static final String TAG = "mtj";private MediaScannerConnection mConn = null;private SannerClient mClient = null;private File mFile = null;private String mMimeType = null;public MediaScanner(Context context) {if (mClient == null) {mClient = new SannerClient();}if (mConn == null) {mConn = new MediaScannerConnection(context, mClient);}}class SannerClient implementsMediaScannerConnection.MediaScannerConnectionClient {public void onMediaScannerConnected() {if (mFile == null) {return;}scan(mFile, mMimeType);}public void onScanCompleted(String path, Uri uri) {mConn.disconnect();}private void scan(File file, String type) {HHLog.i(TAG, "scan " + file.getAbsolutePath());if (file.isFile()) {mConn.scanFile(file.getAbsolutePath(), null);return;}File[] files = file.listFiles();if (files == null) {return;}for (File f : file.listFiles()) {scan(f, type);}}}public void scanFile(File file, String mimeType) {mFile = file;mMimeType = mimeType;mConn.connect();}}
Android MediaScannerConnection扫描文件相关推荐
- android识别手机文件 快速扫描并优化加载速度
一.最近在做一个需求,手机文件的快速扫描功能. 先附上效果图: 二.这边写了四种类型的文件识别,分别为音视频,图片,文件,并调取手机文件,这边分别用了四个Fragment,方便复制粘贴,用哪个粘哪个, ...
- android扫描文件,安卓手机怎么扫描文件_手机扫描文件的图文教程-系统城
在平时工作或学习时,越来越多的时候需要使用到扫描文件,那大家知道安卓手机怎么扫描文件吗?近日有用户就遇到了这一问题,但不知道怎么操作很是苦恼,所以针对这一情况,今天本文为大家整理分享的就是关于手机扫描 ...
- Android系统扫描音频文件详解
扫描文件是在MediaScannerService类的ServiceHandler中: private final class ServiceHandler extends Handler{@Over ...
- android获取卡号号码,Android银行卡扫描获取银行卡号
ard.io开源的银行卡扫描的三方库真的是很好用啊. 首先需要在你的module的gradle的依赖文件中添加依赖 compile 'io.card:android-sdk:5.5.1' 2 清单文件 ...
- android 上下扫描动画,Android扫描雷达动画
很简单的一个组合动画,用好基本动画啥子效果都不怕 老规矩先上图 效果图.gif ok 来 既然往下翻那就看看如何实现的吧 首先效果分为两部分 第一部分中间指针(其实这里就是一张图片) 第二部分就是波纹 ...
- android 垃圾清理 文件清理
欢迎转载,转载请注明:http://blog.csdn.net/zhgxhuaa 说明 在总篇中提到过垃圾清理,本篇将着重介绍针对缓存.卸载残留.无用数据等"静态内容"的清理,有关 ...
- 如何在Android上管理文件和使用文件系统
Android's user-visible file system is one of its advantages over iOS. It allows you to more easily w ...
- Android设备扫描机制详解
Android设备扫描机制详解 本文基于Android pie,对Android的设备扫描机制做一个全面的解析,由于本人掌握的知识有限,如有讲错的地方还请大家指出来. Android提供了一套扫描机制 ...
- php 调用扫描仪,Mac_Mac怎么扫描文件?苹果电脑Mac使用扫描仪扫描文件教程, 当用户安装好扫描仪之后 - phpStudy...
Mac怎么扫描文件?苹果电脑Mac使用扫描仪扫描文件教程 当用户安装好扫描仪之后,那么怎么使用扫描仪对文件进行扫描呢?本文讨论的是通过图像捕捉应用软件(位于"应用程序"文件夹中)进 ...
最新文章
- 在C#中,如何连接已加密的Sqlite数据库
- 数据库跟尾过多的错误,能够的原因阐发及处置惩罚设备
- CSS属性中Display与Visibility
- SaltStack组件
- C++书籍笔记目录汇总【目前1本读书笔记(持续更新中……)】
- 【NLP】 NLP专栏栏主自述,说不出口的话就交给AI说吧
- ES6之路第十三篇:Iterator和for...of循环
- python plt.plot bar 设置绘图尺寸大小
- Linux内核源码分析--内核启动之(1)zImage自解压过程(Linux-3.0 ARMv7) 【转】
- cogs 1811. [NOIP2014]螺旋矩阵
- win7下安装cygwin工具
- go语言介绍及应用场景分析
- 高速PCB设计中的屏蔽方法
- python123平台第四周作业答案_python123答案
- 创新设计思维---自学报告
- ISM无需授权使用的无线频率
- 【视频开发】ONVIF客户端搜索设备获取rtsp地址开发笔记(精华篇)
- springMVC+mybatis+maven搭建过程
- UVa1646 - Edge Case
- 电脑可以上网,浏览器无法访问