Android Download Manager查询无结果,while循环未执行问题排查
问题根因
- 核心错误是调用了错误的过滤API:
setFilterById()用于匹配你提交下载任务时系统返回的下载任务ID,不是用来过滤下载状态的,过滤状态需要调用setFilterByStatus()方法,所以你的查询条件完全不匹配,自然返回空结果。 - 次要错误是Cursor遍历逻辑有误:先执行
c.moveToFirst()后直接进入while(c.moveToNext()),会直接跳过第一条查询到的结果,就算有匹配的任务也可能漏判。 - 额外注意:如果你的应用 targetSdk >= 26,需要保证申请了
android.permission.DOWNLOAD_WITHOUT_NOTIFICATION权限,否则部分系统版本会查询不到其他应用提交的下载任务,自己应用提交的任务不受影响。
修复后的代码
// 检查文件是否在下载队列中 DownloadManager.Query q = new DownloadManager.Query(); // 用setFilterByStatus过滤下载状态,不要用setFilterById q.setFilterByStatus(DownloadManager.STATUS_PAUSED|DownloadManager.STATUS_RUNNING|DownloadManager.STATUS_PENDING); DownloadManager dm = (DownloadManager) mContext.getSystemService(Context.DOWNLOAD_SERVICE); Cursor c = dm.query(q); file_exists = false; // 调整遍历逻辑,避免漏第一条数据 if (c != null && c.moveToFirst()) { do { if("example-file-name.mp4".equals(c.getString(c.getColumnIndex(DownloadManager.COLUMN_TITLE)))){ file_exists = true; holder.download_btn.setVisibility(View.GONE); holder.pgb_downloading.setVisibility(View.VISIBLE); break; } } while (c.moveToNext()); c.close(); }
内容的提问来源于stack exchange,提问作者RaulRohjans
相关产品推荐
相关产品推荐

