Android 12及以上版本收不到推送通知求解决方案(编译/目标版本32)
Android 12+(API 32)推送通知接收失败解决方案
先排查以下几个Android 12+特有的配置和权限问题,这些是导致推送失败的常见原因:
- 确认通知渠道配置有效:Android 12+要求所有通知必须绑定有效的通知渠道,且渠道重要性不能设为最低。创建渠道时得把
setImportance()设为IMPORTANCE_DEFAULT及以上,推送时指定的渠道ID要和创建的完全一致。示例代码:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { val channel = NotificationChannel("your_channel_id", "消息通知", NotificationManager.IMPORTANCE_DEFAULT) channel.description = "接收应用推送消息" val notificationManager = getSystemService(NotificationManager::class.java) notificationManager.createNotificationChannel(channel) }
- 添加并申请POST_NOTIFICATIONS权限:虽然API 32(Android 12L)默认授予该权限,但如果用户手动关闭过就需要重新申请。先在Manifest里加权限:
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
然后针对Android 13+(兼容12+)动态申请:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { if (ContextCompat.checkSelfPermission(this, Manifest.permission.POST_NOTIFICATIONS) != PackageManager.PERMISSION_GRANTED) { requestPermissions(arrayOf(Manifest.permission.POST_NOTIFICATIONS), 1001) } }
- 修正PendingIntent的FLAG设置:Android 12+对
PendingIntent的FLAG有严格限制,不能混用FLAG_IMMUTABLE和FLAG_MUTABLE。如果需要修改Intent内容,必须用FLAG_MUTABLE,适配代码如下:
val flags = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) { PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_MUTABLE } else { PendingIntent.FLAG_UPDATE_CURRENT } val pendingIntent = PendingIntent.getActivity(this, 0, targetIntent, flags)
检查后台运行权限:Android 12+收紧了后台应用限制,如果推送需要后台唤醒应用,得确保应用有“后台活动”权限(在系统设置的应用详情里开启),必要时申请
SCHEDULE_EXACT_ALARM或对应厂商的后台权限。适配第三方推送服务的API 32要求:如果用了Firebase、小米、华为这类推送SDK,先确认SDK版本已经适配Android 12+。比如Firebase Messaging要更到23.0.0以上,同时检查Manifest里的服务、接收器声明是否完整,有没有遗漏厂商要求的配置。
调整推送消息优先级:Android 12+会拦截低优先级通知,把推送消息的优先级设为
high(比如FCM payload里加"priority": "high"),避免被系统延迟或过滤。
内容的提问来源于stack exchange,提问作者Vishal P
相关产品推荐
相关产品推荐

