在 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扫描文件相关推荐

  1. android识别手机文件 快速扫描并优化加载速度

    一.最近在做一个需求,手机文件的快速扫描功能. 先附上效果图: 二.这边写了四种类型的文件识别,分别为音视频,图片,文件,并调取手机文件,这边分别用了四个Fragment,方便复制粘贴,用哪个粘哪个, ...

  2. android扫描文件,安卓手机怎么扫描文件_手机扫描文件的图文教程-系统城

    在平时工作或学习时,越来越多的时候需要使用到扫描文件,那大家知道安卓手机怎么扫描文件吗?近日有用户就遇到了这一问题,但不知道怎么操作很是苦恼,所以针对这一情况,今天本文为大家整理分享的就是关于手机扫描 ...

  3. Android系统扫描音频文件详解

    扫描文件是在MediaScannerService类的ServiceHandler中: private final class ServiceHandler extends Handler{@Over ...

  4. android获取卡号号码,Android银行卡扫描获取银行卡号

    ard.io开源的银行卡扫描的三方库真的是很好用啊. 首先需要在你的module的gradle的依赖文件中添加依赖 compile 'io.card:android-sdk:5.5.1' 2 清单文件 ...

  5. android 上下扫描动画,Android扫描雷达动画

    很简单的一个组合动画,用好基本动画啥子效果都不怕 老规矩先上图 效果图.gif ok 来 既然往下翻那就看看如何实现的吧 首先效果分为两部分 第一部分中间指针(其实这里就是一张图片) 第二部分就是波纹 ...

  6. android 垃圾清理 文件清理

    欢迎转载,转载请注明:http://blog.csdn.net/zhgxhuaa 说明 在总篇中提到过垃圾清理,本篇将着重介绍针对缓存.卸载残留.无用数据等"静态内容"的清理,有关 ...

  7. 如何在Android上管理文件和使用文件系统

    Android's user-visible file system is one of its advantages over iOS. It allows you to more easily w ...

  8. Android设备扫描机制详解

    Android设备扫描机制详解 本文基于Android pie,对Android的设备扫描机制做一个全面的解析,由于本人掌握的知识有限,如有讲错的地方还请大家指出来. Android提供了一套扫描机制 ...

  9. php 调用扫描仪,Mac_Mac怎么扫描文件?苹果电脑Mac使用扫描仪扫描文件教程,  当用户安装好扫描仪之后 - phpStudy...

    Mac怎么扫描文件?苹果电脑Mac使用扫描仪扫描文件教程 当用户安装好扫描仪之后,那么怎么使用扫描仪对文件进行扫描呢?本文讨论的是通过图像捕捉应用软件(位于"应用程序"文件夹中)进 ...

最新文章

  1. 在C#中,如何连接已加密的Sqlite数据库
  2. 数据库跟尾过多的错误,能够的原因阐发及处置惩罚设备
  3. CSS属性中Display与Visibility
  4. SaltStack组件
  5. C++书籍笔记目录汇总【目前1本读书笔记(持续更新中……)】
  6. 【NLP】 NLP专栏栏主自述,说不出口的话就交给AI说吧
  7. ES6之路第十三篇:Iterator和for...of循环
  8. python plt.plot bar 设置绘图尺寸大小
  9. Linux内核源码分析--内核启动之(1)zImage自解压过程(Linux-3.0 ARMv7) 【转】
  10. cogs 1811. [NOIP2014]螺旋矩阵
  11. win7下安装cygwin工具
  12. go语言介绍及应用场景分析
  13. 高速PCB设计中的屏蔽方法
  14. python123平台第四周作业答案_python123答案
  15. 创新设计思维---自学报告
  16. ISM无需授权使用的无线频率
  17. 【视频开发】ONVIF客户端搜索设备获取rtsp地址开发笔记(精华篇)
  18. springMVC+mybatis+maven搭建过程
  19. UVa1646 - Edge Case
  20. 电脑可以上网,浏览器无法访问

热门文章

  1. jquery数组及对象赋值不影响原对象及数组的方法
  2. python 读取文件名 指定编码_Python 文件读写与编码解读
  3. 将自己的手写体制成你自己的字体
  4. redis序列化实体类对象报错
  5. 使用wps2019 给目录加数字时出现按数字自动跳到上一行
  6. jsp255个人交友论坛社交活动网站
  7. 命令提示符 简单使用
  8. python 整数逆位运算_整数及其位运算
  9. 怒斩获了30家互联网公司offer,详细的Android学习指南
  10. 2021-10-04大二上半学期规划