自定义Android通知声音

3
我正在尝试在我的应用程序中实现自定义通知声音。 我编写了以下代码,但是应用程序只播放默认声音,而不是我在raw文件夹中添加的自定义声音。接收通知时,日志甚至没有抛出任何错误或异常,说明为什么它不播放自定义声音。我尝试在网上搜索并尝试了不同的方法,但都没有成功。请告诉我我做错了什么。
编辑:有人可以发布此代码吗? 我似乎找不到任何可行的东西。
Button button;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    button = findViewById(R.id.notify);

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
        NotificationChannel channel = new NotificationChannel("MyCuS Notification", "My Notification", NotificationManager.IMPORTANCE_HIGH);
        NotificationManager manager = getSystemService(NotificationManager.class);
        AudioAttributes.Builder audioAttributes = new AudioAttributes.Builder()
                .setUsage(AudioAttributes.USAGE_NOTIFICATION_RINGTONE);
        channel.setSound(Uri.parse("android.resources://" + getPackageName() + "/" + R.raw.bg_reminder_alarm),audioAttributes.build());
        manager.createNotificationChannel(channel);
    }

    button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            NotificationCompat.Builder builder = new NotificationCompat.Builder(MainActivity.this, "MyCuS Notification");
            builder.setContentTitle("MyTitle");
            builder.setContentText("TESTING");
            builder.setSmallIcon(R.drawable.ic_launcher_background);
            builder.setAutoCancel(true);
            builder.setSound(Uri.parse("android.resources://" + getPackageName() + "/" + R.raw.bg_reminder_alarm));
            NotificationManagerCompat managerCompat = NotificationManagerCompat.from(MainActivity.this);
            managerCompat.notify(1, builder.build());
        }
    });
}

编辑2:我尝试删除现有的频道并发送通知以创建新的频道,当新创建的频道在发送第二个通知后,频道的描述会更改,就好像覆盖或删除了该频道并创建了新的默认频道。

enter image description here

1个回答

2
自 Android Oreo / 8 版本开始,通知声音来自于通道,并且只能在第一次通过 channel.setSound() 添加通道时设置。如果您想稍后更改它,需要删除该通道,然后重新将其添加到系统中。但是用户会被警告此行为(应用已删除 X 次通道)。详情请参见 https://developer.android.com/guide/topics/ui/notifiers/notifications#ManageChannels
如果您想每次都有自定义的声音,则需要一个前台服务,其前台通知没有通道声音(setSound(null)),然后使用 MediaPlayer 在 Notification 流上播放自定义声音。

那么声音只会从通道中播放一次,下一次它将再次播放默认的声音? - Aagam Shah
它将始终播放您在通道中设置的声音,但仅限于您第一次创建该通道时设置的声音,除非您删除该通道并重新添加该通道。这是为了确保用户可以通过 Android 设置更改通道声音(以及所有其他设置)。 因此,每次想要发送推送时都添加该通道实际上没有必要或好处,只需在应用程序安装时运行一次即可满足要求。 - seaforester
我尝试添加自定义声音,但通知播放默认声音。我不知道出了什么问题。 - Aagam Shah
确保您删除了之前的通道: notificationManager.deleteNotificationChannel("MyCuS Notification"); 或者添加一个全新的通道,否则它将继续使用您旧的默认声音。然后在新创建的通道上: channel.setSound(null, null); - seaforester
我甚至已经这样做了,请查看第二次编辑,不知何故该通道被覆盖或破坏,后来创建了新的默认通道。 - Aagam Shah
将以下内容添加到您的清单中: <meta-data android:name="com.google.firebase.messaging.default_notification_channel_id" android:value="MyCuS Notification" /> 如果这不起作用,也许您可以在有效载荷中指定它,请参阅:https://dev59.com/DlcO5IYBdhLWcg3wXgbh#69114548 - seaforester

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接