You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

小米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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 04:53:21