如何匹配Android DownloadManager下载项与MediaStore中生成的对应记录
DownloadManager条目与MediaStore记录匹配方案
方法1:通过文件路径+文件名组合匹配
这是兼容性最高、误判率最低的匹配方式,操作步骤如下:
- 从DownloadManager查询下载完成的条目时,通过
DownloadManager.COLUMN_LOCAL_URI或者低版本可用的DownloadManager.COLUMN_LOCAL_FILENAME获取文件的绝对路径、完整文件名 - 查询MediaStore时,读取
MediaStore.Downloads.DATA字段(Android 10及以下适用)、MediaStore.Downloads.DISPLAY_NAME字段,分别和从DownloadManager拿到的路径、文件名做双重匹配,保证准确率 - 如果下载时指定了自定义存储路径,查询MediaStore时要确保覆盖对应存储分区的路径范围
方法2:通过包名过滤+特征字段组合匹配
针对Android 10及以上系统,可以利用系统预留的包名字段缩小匹配范围:
- 先从DownloadManager拉取当前应用发起的所有下载任务,记录每个任务的文件大小、最后修改时间戳、文件名三个特征字段
- 查询MediaStore.Downloads表时,先添加过滤条件
MediaStore.Downloads.OWNER_PACKAGE_NAME = "你的应用包名",过滤掉其他应用产生的下载记录 - 再用之前记录的文件大小、最后修改时间、文件名三个特征组合匹配,几乎不会出现误匹配的情况
注意事项
- 不要依赖下载URL匹配:DownloadManager会自动处理301/302跳转,最终请求的URL和你传入的原始URL大概率不一致,MediaStore存储的也是最终下载地址,匹配没有参考价值
- Android 12及以上系统,查询自身应用产生的MediaStore下载记录不需要申请额外存储权限,只有查询其他应用的下载记录才需要特殊权限
- 如果下载的是图片、视频、音频类媒体文件,可以额外匹配
MediaStore.MediaColumns.MIME_TYPE字段,和DownloadManager返回的COLUMN_MEDIA_TYPE做二次校验,进一步降低误判概率
内容的提问来源于stack exchange,提问作者user7431543
相关产品推荐
相关产品推荐

