Android多媒体扫描机制分析(一)

想发起media扫描一般我们有两种方式: 1.发送广播 我们先不讲原理,先来看看Android源码中是如何发起一次扫描的 private void updateMediaStore(String path) { Intent intent_mount = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE); intent_mount.
摘要由CSDN通过智能技术生成

想发起media扫描一般我们有两种方式:
1.发送广播
我们先不讲原理,先来看看Android源码中是如何发起一次扫描的

private void updateMediaStore(String path) {
  Intent intent_mount = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
  intent_mount.setData(Uri.fromFile(new File(path)));
  context.sendBroadcast(intent_mount);
 }

上述代码是DownloaderImpl.java中的一个方法,作用就是发起一次扫描以更新媒体信息,ACTION_MEDIA_SCANNER_SCAN_FILE表示发起一次文件的扫描。下一行在Intent中放入待扫描文件的uri。
可以看到通过广播方式发起一次扫描的步骤很简单,可以总结为:1.新建Intent,指定action;2.向intent中传入待扫描文件的uri;3.发送广播

了解了发起扫描的步骤,自然我们会疑惑:那发送什么ACTION的广播才会发起扫描呢?如果我要扫描的不是一个文件而是一个文件夹及其内部的文件呢?难道除了手动发起扫描其他时刻就不会进行扫描了吗?这些问题都可以在媒体扫描模块的广播接收器MediaScannerRecevier中得到答案,下面我们一起来分析一下MediaScannerReceiver的代码。

在MediaScannerRecevier(下面简称MSR)中最重要的自然就是onReceiver方法,通过阅读源码发现onReceive方法首先取出存在intent中的action和待扫描文件的URI,并且根据action不同采取不同的操作,具体如下:
1.ACTION_BOOT_COMPLETED : 在接收到开机完成广播之后对内部卷和外部卷进行扫描,通过调用

scan(context,MediaProvider.INTERNAL_VOLUME); 
scan(context, MediaProvider.EXTERNAL_VOLUME);

这两个方法,开启MediaScannerService服务,以下简称MSS,并传入需要扫描的volume进行扫描。具体的扫描过程很复杂,我将会在下一篇blog中进行讲解
2.ACTION_MEDIA_MOUNTED: 在接收到外部存储设备挂载的广播也会通过启动MSS发起扫描,内部卷外部卷均会被扫描
3.ACTION_MEDIA_SCANNER_SCAN_FILE : 发起单个文件的扫描请求,也会通过启动MSS来进行扫描,一般是其他程序发出该请求,比如新下载了一个文件,这时候DownLoadManager应该向MediaScannerService发起扫描该文件的请求
4.ACTION_MEDIA_SCANNER_SCAN_FOLDER: 发起扫描文件夹请求,也是通过启动MSS来进行扫描,一般是其他程序发出该请求,比如通过MTP传入了一个文件夹,这时候MTPService应该向MediaScannerService发起扫描该文件的请求
可见MSR的功能就是接收各种扫描的请求,从而通过启动MSS来进行扫描,真正进行扫描的工作主要是由MSS及其相关模块来进行


 @Override
    public void onReceive(Context context, Intent intent) {
        final String action = intent.getAction();
        final Uri uri = intent.getData();

        if (Intent.
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值