最近公司产品有个需求:检测到U盘插入,只扫描U盘里的歌曲(音频文件)。
技术要点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:多媒体文件扫描优化
分析多媒体数据库,会发现files表,不管啥文件,都会往里写东西。于是研究源码,看看这个数据库表是如何一步一步加载出来的。