小米Android11/12设备DownloadManager查询崩溃问题求助
问题解答
1. DownloadManager用法修正与正确检查下载状态的方式
你的代码逻辑本身没有错误,但崩溃根源是小米ROM的DownloadManager底层默认查询了API 24后废弃的COLUMN_LOCAL_FILENAME字段,而Android 11/12(API29+)对该字段的访问做了严格限制。
解决方法是明确指定查询的列(Projection),只请求你需要的COLUMN_STATUS字段,避免底层查询到受限的废弃字段。修改后的代码如下:
fun isDownloadInProgress(): Boolean { val dq = DownloadManager.Query().apply { setFilterById(downloadId) // 仅指定需要查询的字段,避免默认触发受限字段的查询 setProjection(arrayOf(DownloadManager.COLUMN_STATUS)) } downloadManager.query(dq)?.use { cursor -> if (cursor.moveToFirst()) { val status = cursor.getInt(cursor.getColumnIndex(DownloadManager.COLUMN_STATUS)) return status == DownloadManager.STATUS_RUNNING || status == DownloadManager.STATUS_PENDING } } return false }
这里用setProjection限定查询范围,同时用use自动管理Cursor的关闭,既解决了崩溃问题,也符合Kotlin资源管理的最佳实践。
2. 是否为小米ROM的bug?
这确实是小米定制ROM的兼容性bug。原生Android中,DownloadManager的query方法虽底层定义了包含COLUMN_LOCAL_FILENAME的UNDERLYING_COLUMNS,但在API29+系统上会自动处理该字段的访问限制,不会抛出异常;而小米ROM修改了DownloadManager的底层实现,导致查询时直接触发column local_filename is not allowed in queries的非法参数异常。
目前已有不少开发者在小米官方反馈渠道上报该问题,但官方尚未给出正式修复时间表。
内容的提问来源于stack exchange,提问作者Alexander Lomovskiy
相关产品推荐
相关产品推荐

