禁用NotificationChannel中的声音

问题描述 投票:53回答:9

今天我开始针对API 26,这迫使我使用通知频道。

我的问题是,现在每个新通知(包括对它的更新)都会播放恼人的声音。

如何禁用此声音?

我尝试用自定义的mp3声音替换这个声音,然后在其中传递一个静音的mp3,但这被忽略了。

我只是添加一个优先级非常低的通知,基本上让用户可以选择在与应用程序交互后执行某些操作。没有理由大声说话,用户会知道他可以参考通知,因为他已经对应用程序做了一些他知道会导致通知出现的事情。

用户真的会开始对这种声音感到恼火。

android notifications
9个回答
88
投票

如果你想保持你的频道的重要性,只是删除声音notificationChannel.setSound(null, null);似乎做的工作。

编辑:确保重命名频道(并删除旧频道)以将其应用于现有用户。 (可以创建频道,但不会被应用修改,只有用户才能修改。)


80
投票

(更新2019-05:Android Q会变得更糟,在使用NotificationManager.IMPORTANCE_LOW时我甚至会发出声音,至少在模拟器中......)


解决方案是使用NotificationManager.IMPORTANCE_LOW并为其创建新的渠道。创建频道后,您无法更改重要性(嗯,您可以,但忽略新的重要性)。频道信息似乎由系统永久存储,并且只有在您卸载应用程序时才会删除创建的任何频道。 [更新:根据Ferran Negre的评论,您可以通过nm.deleteNotificationChannel(nChannel.getId());删除频道并使用nm.createNotificationChannel(nChannel);重新创建它,但显然存在一个限制,您无法创建具有已删除频道的相同ID的频道,并期望能够应用不同的设置到未删节的频道,请参阅acoder的回答]

虽然以前的Android版本默认没有播放声音,但是这已经改变了Android O,但只有当您定位API 26时,即使用通知频道。这是不一致的,实际上,这是一个错误:

原因是当你使用NotificationManager.IMPORTANCE_DEFAULT创建一个频道(默认情况下不值得)时,Android实际上会“稍微”将其注册为NotificationManager.IMPORTANCE_HIGH(默认播放声音)。

您可以通过进入通知选项(长按通知条目)来检查这一点,在那里您将看到它是NotificationManager.IMPORTANCE_HIGH类型,然后禁用通知然后重新启用它。在这个过程中,它从NotificationManager.IMPORTANCE_HIGH“降级”到不起眼的,实际登记的NotificationManager.IMPORTANCE_DEFAULT

The bug has been submitted to the Android issue tracker, so you may want to star it(谷歌称其为“不会修复(不可行)”,因为......被宠坏了)。


BETWEEN,qazxsw ppi的新医生声称默认行为曾经是这样,默认在Android 8.0之前播放声音,这绝对不是真的。这是他们的清单

https://developer.android.com/training/notify-user/channels

你甚至可以看到能见度重要性高和通知重要性之间的不匹配......我不知道为什么他们这样做。他们的代码肯定有一个错误。


下一行下面的所有内容都已过时,但那里提到的bug仍然有效。我的错误是认为User-visible importance level Importance Priority (Android 8.0 and higher) (Android 7.1 and lower) Urgent Makes a sound and appears as IMPORTANCE_HIGH PRIORITY_HIGH a heads-up notification or PRIORITY_MAX High Makes a sound IMPORTANCE_DEFAULT PRIORITY_DEFAULT Medium No sound IMPORTANCE_LOW PRIORITY_LOW Low No sound and does not appear IMPORTANCE_MIN PRIORITY_MIN in the status bar 是来自NotificationManager.IMPORTANCE_MIN的下一个较低的,但NotificationManager.IMPORTANCE_DEFAULT是。


然后,当您通过长按通知和全通道按钮进入应用程序的通知设置并关闭该通道的开关并再次打开时,它实际上将自己设置为NotificationManager.IMPORTANCE_LOW并且不会播放任何声音。我也注意到在崩溃后它确实被重置为NotificationManager.IMPORTANCE_DEFAULT

所以基本上解决方法是使用NotificationManager.IMPORTANCE_HIGH。但是你必须创建一个新的频道,以便这个NotificationManager.IMPORTANCE_MIN生效,因为一旦你创建了它,你似乎无法改变现有频道的重要性。

更新:使用NotificationManager.IMPORTANCE_MIN解决方法有一个缺点。

当您使用该重要性级别时,您的通知不再完全显示在通知抽屉内,而是将其自身插入到默认折叠的新通知通道组中(并且每次拉下抽屉时将再次折叠)。太可惜了!

更新2:深入挖掘它发现它好像它正确地将其注册为NotificationManager.IMPORTANCE_MIN,但不知何故它神奇地升级到NotificationManager.IMPORTANCE_DEFAULT,就像当用户明确地将设置从默认更改为高时。在关闭通知然后再打开之后,也会将其重置为默认值。


2
投票
NotificationManager.IMPORTANCE_HIGH

创建通知时它不会产生声音,因为我在音乐应用程序中需要相同的声音。

是的,如果您已经创建了通知通道,则需要更改通道ID,或者只需卸载以前的应用程序并再次安装。


1
投票

据我所见,自API 26(奥利奥)以来,一旦创建通知后就无法改变通知的声音。

NotificationManager.IMPORTANCE_LOW

甚至在创建之前删除频道也无济于事。

谷歌文档说:

notificationManager.deleteNotificationChannel("channel_id")); NotificationChannel notificationChannel = new NotificationChannel( "channel_id", "channel_name", NotificationManager.IMPORTANCE_HIGH); notificationChannel.setSound(null, null); notificationManager.createNotificationChannel(notificationChannel);

删除给定的通知通道。如果您使用相同的ID创建新频道,则删除的频道将被删除,并删除之前的所有相同设置。

android.app.NotificationManager public void deleteNotificationChannel(String channelId)文件说明

只有在渠道提交给NotificationChannel#setSound()之前才可以修改

太糟糕了,NotificationManager#createNotificationChannel(NotificationChannel)不起作用:

此方法在API级别26中已弃用。请改用NotificationChannel#setSound(Uri,AudioAttributes)。

另外使用支持库不起作用。因此声音只能在应用程序中设置一次,并且用户只能在通知设置中进行更改。对我来说notificationBuilder.setSound(defaultSoundUri)评论没有用。我不明白Google为什么会这样做。太糟糕了。


0
投票

如果案件与我的情况一样,我不得不显示后台服务的通知,我真的不想显示任何通知,解决方案适用于8.0:

Ferran Negre's

有了这个,我不仅每隔5分钟就听到烦人的声音,而且最小化了通知本身的外观。

在8.1我没有以下声音的问题:

.setPriority(NotificationManager.IMPORTANCE_NONE)

-1
投票

首先你需要设置

.setPriority(NotificationManager.IMPORTANCE_MIN)

然后

importance = NotificationManager.IMPORTANCE_LOW;

-1
投票
Notification n = builder.setPriority(Notification.DEFAULT_ALL).build();
n.defaults = 0;
n.defaults |= Notification.DEFAULT_VIBRATE;

这将有效,但也会折叠您的通知。


-1
投票

我在8.1中遇到了同样的问题并进行了以下更改。将通知的优先级更改为LOW,它将禁用通知声音。

NotificationManager.IMPORTANCE_LOW

代码如下:

NotificationManager.IMPORTANCE_LOW

-2
投票

NotificationChannel chan1 = new NotificationChannel("default", "default", NotificationManager.IMPORTANCE_LOW); 肯定会工作

© www.soinside.com 2019 - 2024. All rights reserved.