You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Oreo设备FCM通知不显示求助(已尝试创建通知渠道)

解决Oreo设备上FCM通知仅响铃无抽屉内容的问题

看起来你遇到了Android 8.0(Oreo,API 26)及以上版本的典型通知问题——这个版本开始系统强制要求使用通知渠道(Notification Channel),如果渠道配置不当或者通知未正确绑定渠道,就会出现只有提示音但通知抽屉无内容的情况。结合你的代码场景,我整理了针对性的解决方案:

1. 确保正确创建通知渠道(只需执行一次)

Oreo及以上,通知渠道是系统级配置,只需创建一次(系统会保存渠道信息,重复调用不会覆盖用户手动修改的设置)。你可以在App启动时(比如ApplicationonCreate方法)或者第一次发送通知前执行这段代码:

private void createNotificationChannel(Context context) {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
        // 注意:渠道ID必须唯一,后续通知要使用完全相同的ID
        String channelId = "fcm_notification_channel";
        String channelName = "FCM通知";
        String channelDescription = "接收应用推送的FCM通知";
        // 重要性不能设为IMPORTANCE_NONE,否则通知会被隐藏
        int importance = NotificationManager.IMPORTANCE_DEFAULT;

        NotificationChannel channel = new NotificationChannel(channelId, channelName, importance);
        channel.setDescription(channelDescription);
        // 配置振动、灯光等你需要的效果
        channel.enableVibration(true);
        channel.setVibrationPattern(new long[]{0, 300L});
        channel.enableLights(true);
        channel.setLightColor(Color.parseColor("#FF0000"));

        // 注册渠道到系统
        NotificationManager notificationManager = context.getSystemService(NotificationManager.class);
        notificationManager.createNotificationChannel(channel);
    }
}

2. 构建通知时必须绑定渠道ID+设置小图标

这是最容易踩的坑:Oreo及以上如果通知没有绑定正确的渠道ID,或者未设置小图标,通知只会触发声音/振动,但不会显示在通知抽屉里。修改你的SendNotificationTask代码:

public class SendNotificationTask extends AsyncTask<Void, Void, Void> {
    private static final long DEFAULT_VIBRATION = 300L;
    private Context mContext;
    private Bundle bundle;
    private Boolean mIsForeground;

    // 构造函数等其他代码...

    @Override
    protected Void doInBackground(Void... voids) {
        // 先确保渠道已创建
        createNotificationChannel(mContext);

        String channelId = "fcm_notification_channel"; // 和创建渠道时的ID完全一致
        NotificationCompat.Builder builder = new NotificationCompat.Builder(mContext, channelId)
                // 必须设置小图标!没有这个通知不会显示在抽屉里
                .setSmallIcon(R.drawable.ic_notification_icon)
                // 确保bundle里的title和message不为空,设置默认值兜底
                .setContentTitle(bundle.getString("title", "新通知"))
                .setContentText(bundle.getString("message", "您有一条新消息"))
                .setPriority(NotificationCompat.PRIORITY_DEFAULT)
                .setVibrate(new long[]{0, DEFAULT_VIBRATION})
                .setAutoCancel(true);

        // 可选:添加点击跳转的PendingIntent
        Intent resultIntent = new Intent(mContext, YourTargetActivity.class);
        PendingIntent pendingIntent = PendingIntent.getActivity(
                mContext,
                0,
                resultIntent,
                PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE
        );
        builder.setContentIntent(pendingIntent);

        // 发送通知
        NotificationManagerCompat notificationManager = NotificationManagerCompat.from(mContext);
        notificationManager.notify(1001, builder.build()); // 1001是唯一的通知ID,可按需修改

        return null;
    }

    // 把创建渠道的方法放在这里或者工具类中
    private void createNotificationChannel(Context context) {
        // 同上段代码...
    }
}

3. 额外排查点

如果按上面的步骤修改后还是有问题,检查以下几点:

  • 渠道ID一致性:创建渠道和通知构建时的channelId必须完全匹配(大小写敏感)
  • 通知权限:用户是否在系统设置中禁用了应用的通知,或者该渠道被手动关闭?可以引导用户前往「设置→应用→你的应用→通知」查看
  • 通知内容非空:确保bundle中的titlemessage不是空字符串,否则通知可能无法正常显示
  • 线程问题:虽然NotificationManagerCompat.notify可以在后台线程调用,但如果遇到异常,可尝试切换到主线程发送通知(比如用runOnUiThread

内容的提问来源于stack exchange,提问作者Vikas Jadhavar

火山引擎 最新活动