小米与三星设备通知不显示问题求助(附代码)
解决小米、三星设备通知无法显示的问题
从你的描述和代码来看,这个问题大概率是Android 8.0+ 通知渠道缺失加上部分厂商定制系统的额外限制导致的,咱们一步步拆解解决:
1. 补全Android 8.0+强制要求的通知渠道
从Android 8.0(API 26)开始,所有通知必须绑定到对应通知渠道,否则系统会直接拦截通知——这是三星、小米这类严格遵循系统规范的设备不显示通知的核心原因,你的代码完全缺失了这部分逻辑。
先添加通知渠道创建方法:
private void createNotificationChannel() { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { CharSequence channelName = "应用通知"; // 可自定义渠道名称,用户能在系统设置里看到 String channelDesc = "接收应用的所有通知提醒"; int importance = NotificationManager.IMPORTANCE_DEFAULT; // 决定通知是否弹出、响铃等 NotificationChannel channel = new NotificationChannel("APP_MAIN_CHANNEL", channelName, importance); channel.setDescription(channelDesc); // 按需配置通知的声音、震动 channel.enableVibration(true); channel.setSound(RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION), null); NotificationManager notificationManager = getSystemService(NotificationManager.class); notificationManager.createNotificationChannel(channel); } }
然后在showNotification()开头调用这个方法,同时修改Builder初始化时指定渠道ID:
NotificationCompat.Builder builder = new NotificationCompat.Builder(MainActivity.this, "APP_MAIN_CHANNEL");
2. 适配Android版本的PendingIntent与通知API
你的代码里有两处旧API适配问题,可能触发厂商系统的拦截:
- 替换
builder.getNotification()为builder.build(),前者是过时API,后者适配高版本系统 - 给PendingIntent添加
FLAG_IMMUTABLE(Android 12+强制要求),避免权限异常
修改后的PendingIntent代码:
PendingIntent pendingIntent = stackBuilder.getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE);
3. 针对三星、小米的额外系统权限排查
虽然你已经开启了自启动和电池管理,但这两个厂商的系统还有隐藏限制:
- 三星设备:进入「设置-通知-你的应用」,确认刚才创建的通知渠道是否开启;同时检查「通知历史」,如果这里也看不到通知,说明系统根本没接收到通知请求(大概率是渠道缺失导致)
- 小米设备:除了电池无限制,还要进入「设置-通知与控制中心-通知管理」,开启应用的「悬浮通知」「锁屏通知」权限;部分机型还需要在「隐私保护-保护隐私-特殊权限设置-显示悬浮窗」里授权
4. 代码里的其他优化点
- 你定义了
iconUrl但没用到,如果要加载网络大图,别用主线程同步加载,建议用Glide/Picasso异步加载后再设置LargeIcon setContentInfo()是旧API,建议替换为setSubText(),适配更高版本系统
修改后的完整showNotification()方法:
public void showNotification() { // 先创建通知渠道 createNotificationChannel(); String appname = "App Name"; String title = "Notification Title"; String text = "This is the notification text"; NotificationManager notifyManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); TaskStackBuilder stackBuilder = TaskStackBuilder.from(MainActivity.this); stackBuilder.addParentStack(NewsActivity.class); stackBuilder.addNextIntent(new Intent(MainActivity.this, NewsActivity.class)); PendingIntent pendingIntent = stackBuilder.getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE); NotificationCompat.Builder builder = new NotificationCompat.Builder(MainActivity.this, "APP_MAIN_CHANNEL"); builder.setContentTitle(title) .setSubText(appname) // 替换setContentInfo .setLargeIcon(BitmapFactory.decodeResource(getResources(), R.drawable.logo_wanda_flp)) .setContentText(text) .setContentIntent(pendingIntent) .setSmallIcon(R.drawable.logo_wanda_flp) .setAutoCancel(true); // 点击通知后自动取消 notifyManager.notify(123, builder.build()); }
测试时可以换几个不同的通知ID发送,避免系统因为重复通知标识而过滤掉新通知。
内容的提问来源于stack exchange,提问作者aleen
相关产品推荐
相关产品推荐

