Android DownloadManager下载文件时不显示通知问题求助
问题排查与修复方案
1. 适配Android 13+通知权限
Android 13(API Level 33)引入了POST_NOTIFICATIONS运行时权限,你仅适配了Android 11及更低版本的存储权限,未申请该通知权限的话,下载通知会被系统直接拦截。
- 首先在
AndroidManifest.xml中添加权限声明:
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
- 在触发下载前,主动向用户申请该运行时权限,用户同意后再执行下载逻辑。
2. 修正代码逻辑错误
你的代码存在两处明显问题,可能影响通知正常展示:
- 错误截断下载地址:
Uri.parse(chatModel.chatItem.substringBeforeLast("."))会把正常下载链接后缀去掉,大概率导致下载请求异常 - 路径处理混淆:命名为
directory的变量实际指向目标文件而非父目录,调用mkdir()会创建和目标文件同名的文件夹,引发不可预期的逻辑异常
修正后的代码如下:
private fun downloadFileIntoDevice(){ val fileExtension = chatModel.chatItem.substringAfterLast(".") // 先创建父目录 val parentDir = File(Environment.getExternalStorageDirectory().path + "/jobsFolder") if(!parentDir.exists()){ parentDir.mkdirs() // 用mkdirs确保多级目录创建成功 } // 生成目标文件 val targetFile = File(parentDir, UUID.randomUUID().toString().substring(0,5) + "." + fileExtension) // 直接传入完整下载地址,不要截断 val downloadRequest = DownloadManager.Request(Uri.parse(chatModel.chatItem)) downloadRequest.setTitle("الملف") downloadRequest.setDescription("تحميل الملف") downloadRequest.setAllowedNetworkTypes(DownloadManager.Request.NETWORK_WIFI or DownloadManager.Request.NETWORK_MOBILE) downloadRequest.setDestinationUri(Uri.fromFile(targetFile)) // 下载中、下载完成后都展示通知,如需完成后自动隐藏可换回VISIBILITY_VISIBLE downloadRequest.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED); // Android 8.0+主动指定通知渠道,避免渠道被默认关闭 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { downloadRequest.setNotificationChannelId(DownloadManager.Request.NETWORK_NOTIFICATION_CHANNEL_ID) } val downloadID = downloadManager.enqueue(downloadRequest) }
3. 其他排查点
- 检查设备系统通知设置,确认你的APP通知权限、下载通知类别都处于开启状态
- 部分国产ROM的省电策略、拦截规则会默认隐藏后台下载通知,可尝试把APP加入电池优化白名单后测试
- 确认
downloadManager实例是通过context.getSystemService(DownloadManager::class.java)正确获取的
内容的提问来源于stack exchange,提问作者Taki
相关产品推荐
相关产品推荐

