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

Android 14后台接收FCM通知时自定义铃声播放异常求助

Android 14 后台通知铃声异常播放问题解决

问题分析

接收FCM推送后创建静音通知渠道并展示静音通知,随后调用Ringtone.play()自定义播放铃声。该逻辑在Android 14以下版本正常运行,但Android 14中即便通知和渠道都配置为静音,仍会触发默认通知音。

核心原因是Android 14(API 34)对通知流音频的行为做了严格限制:当使用AudioAttributes指定STREAM_NOTIFICATION流播放音频时,系统会强制关联当前应用通知渠道的声音配置逻辑,即便手动设置了渠道静音,也可能触发系统默认通知音。

解决方案

1. 修改Ringtone的AudioAttributes类型

将播放音频的流从通知流改为媒体流,避免系统将其识别为通知相关音频:

Uri uri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
ringtone = RingtoneManager.getRingtone(this, uri);
AudioAttributes audioAttributes = new AudioAttributes.Builder()
        .setContentType(AudioAttributes.CONTENT_TYPE_MUSIC)
        .setUsage(AudioAttributes.USAGE_MEDIA) // 使用媒体用途而非通知流
        .build();
ringtone.setAudioAttributes(audioAttributes);
ringtone.play();

2. 优化通知渠道与通知的静音配置

确保通知渠道和通知的静音设置完全生效,避免冗余配置导致冲突:

  • 渠道创建时明确设置静音属性:
private void checkAndCreateNotificationChannel() {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
        if (mChannel == null) {
            String channelName = getString(R.string.app_name_short) + " Notifications";
            mChannel = new NotificationChannel(channelId, channelName, NotificationManager.IMPORTANCE_HIGH);
            mChannel.enableLights(true);
            mChannel.setDescription(channelName);
            mChannel.setSound(null, null);
            mChannel.setSilent(true); // 明确标记渠道静音
        }
        mNotificationManager.createNotificationChannel(mChannel);
    }
}
  • 通知构建时修正flags赋值方式,避免覆盖已有配置:
NotificationCompat.Builder builder = new NotificationCompat.Builder(context, channelId);
builder.setSmallIcon(R.mipmap.ic_launcher);
Bitmap largeIcon = BitmapFactory.decodeResource(context.getResources(), R.mipmap.ic_launcher);
builder.setContentTitle(title);
builder.setLargeIcon(largeIcon);
builder.setContentText(message);
builder.setStyle(new NotificationCompat.BigTextStyle().bigText(message));
builder.setLights(Color.RED, 3000, 3000);
builder.setSound(null);
builder.setAutoCancel(true);
builder.setTimeoutAfter(10000);
builder.setPriority(Notification.PRIORITY_HIGH);
builder.setChannelId(channelId);
builder.setSilent(true);
// 改用addFlags替代直接赋值,防止覆盖之前的配置
builder.addFlags(Notification.DEFAULT_LIGHTS | Notification.FLAG_AUTO_CANCEL);

3. 验证并更新已存在的通知渠道

Android 14中用户或系统可能修改已创建的渠道配置,可在展示通知前重新检查并同步设置:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
    NotificationChannel existingChannel = mNotificationManager.getNotificationChannel(channelId);
    if (existingChannel != null) {
        existingChannel.setSound(null, null);
        existingChannel.setSilent(true);
        mNotificationManager.createNotificationChannel(existingChannel);
    }
}

内容的提问来源于stack exchange,提问作者Khalid Ahmad Fazli

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 20:52:45