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
相关产品推荐
相关产品推荐

