Android源码个个击破之-多媒体扫描

最近公司产品有个需求:检测到U盘插入,只扫描U盘里的歌曲(音频文件)


  1. 技术要点1-adb指令得出U盘存储的真实路径:

    监听U盘挂载(ACTION_MEDIA_MOUNTED)后,执行shell指令。


 File file = File();
      (file.exists()){
          ShellUtils.ShellResult shellResult = ShellUtils.(, );
          (!TextUtils.(shellResult.)){
              MusicScanUtil.= shellResult..split()[].trim();SPUtil.(SPUtilKeys.,MusicScanUtil.);
              context.sendBroadcast(Intent(MusicUIRefreshReceiver.));
              Toast.(context, + usb.getAbsolutePath(), Toast.).show();
          }

        最终MusicScanUtil.U_PATH存储的就是类似storage/EFDE-UEYT或者 storage/78634982792这种路径,不同型号的U盘不一样。

        之所以要得出这个路径,是因为“context.getContentResolver().query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,...)”扫描出来媒体文件,不光有内部存储的,还有SD卡和U盘上的,可以根据多媒体数据库表中的_data字段结合这个路径过滤U盘中的歌曲。

    

在测试的过程中,发现U盘里如果文件越多,媒体文件(视频)越多,则音频文件扫描出来的越慢。

  • 优化1:检索数据库优化

        getContentResolver().query()方法加上路径过滤条件。

    //selection: 指定查询条件
    String selection = MediaStore.Audio.Media.DATA + " like ?";
    
    String[] selectionArgs = {MusicScanUtil.U_PATH  + "%"};
    
    Cursor cursor = context.getContentResolver().query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,  muiscInfoArray, selection, selectionArgs, null);
  • 优化2:多媒体文件扫描优化

       image.png

      分析多媒体数据库,会发现files表,不管啥文件,都会往里写东西。于是研究源码,看看这个数据库表是如何一步一步加载出来的。

      



    



猜你喜欢

转载自blog.51cto.com/4259297/2422000