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

小米与三星设备通知不显示问题求助(附代码)

解决小米、三星设备通知无法显示的问题

从你的描述和代码来看,这个问题大概率是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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 22:12:31