如何在Android O中动态更改通知声音

11

最近我使用通知渠道来支持安卓O。但问题是我不能动态地更改声音Uri。我们的应用有通知声音设置,用户可以根据自己的喜好更改应用程序通知音。但如你所知,现在安卓不允许开发者在用户重新安装应用程序之前更新通知渠道。因此,我考虑了几种可能的解决方案,但它们并不完美。

  1. 使用用户铃声管理器播放铃声,而不是设置音效。但当用户在应用设置中禁用通知时,铃声仍然会继续播放。(这将是糟糕的用户体验)

  2. 当用户更改铃声声音时删除通知渠道并新建一个。但这看起来也很糟糕,因为在应用内设置中,谷歌会显示已删除频道信息的历史记录。(实际上不必要)

是否有更好的解决方案?


1
请注意,如果您重用通知通道名称,则 #2 不起作用:它只会将通道恢复为在删除它之前的状态。 - ianhanniballake
2个回答

13
在Android O及以上版本的设备上,您应该删除应用程序内的任何特定通知设置,并在您的设置屏幕中提供一个链接,打开系统的通知渠道设置,用户可以直接调整通知渠道的声音。

2
但是我们想要为我们的应用程序使用自定义声音,而不是由Google设备提供的铃声。正如我所说,用户可以从列表中选择他们喜欢的铃声声音。(这些声音是由我们的用户之前录制的)。我知道为什么Google引入了通知渠道,但无法理解为什么他们不允许动态修改setSound。 - Wooram Jung
4
您添加到铃声目录的任何铃声都将自动提供以供选择。在创建后,频道的设置归用户所有 - 他们是选择重要性级别(即您的通知是否发出声音)以及直接在单个集中式系统UI中选择声音的人。 - ianhanniballake
3
有些用户投诉说在他们的手机上系统通知设置缺少更改提示音选项。我收到了三个截图,分别来自三款手机:三星A5、华为荣耀View 10和华为荣耀9,这些截图展示了使用GMail通知设置按钮时出现的问题。有人遇到过类似的情况吗? - mdicosimo
2
@mdicosimo 是的,我尝试了华为nova、小米PAD 4,用户只能打开/关闭声音,不能选择不同的铃声。 - Chandler
5
如果说我有20个用户可以选择的声音,那最好的做法是什么呢?我应该将所有内容复制到铃声文件夹中吗?这样会影响其他应用程序和用户的SD卡吗?我希望这些声音保持在我的应用程序内部。 - Waza_Be
显示剩余4条评论

1

@RequiresApi(api = Build.VERSION_CODES.O) private void createChannels() { }


请创建频道(createChannels),并检查API是否为Build.VERSION_CODES.O。
    Nmanager = (NotificationManager) this.getSystemService(Context.NOTIFICATION_SERVICE);

    AudioAttributes attributes = new AudioAttributes.Builder()
            .setUsage(AudioAttributes.USAGE_NOTIFICATION)
            .build();

    ArrayList arrayList = new ArrayList<String>();
    Field[] fields = R.raw.class.getFields();
    for (int i = 1; i < fields.length - 1; i++) {
        arrayList.add(fields[i].getName());
    }


    DBRingtone RDB = new DBRingtone(this);
    Cursor cursor = RDB.getringtone();

    if (cursor.getCount() > 0) {

        int ring = parseInt(cursor.getString(0));

         resID = getResources().getIdentifier((String) arrayList.get(ring), "raw", getPackageName());

        i=i+resID;

        uri = Uri.parse("android.resource://" + getPackageName() + "/" + resID);
    } else
        {
            i=i+10;
        uri = Uri.parse("android.resource://" + getPackageName() + "/" + R.raw.default_sound);
    }

    CHANNEL_ID = CHANNEL_ID+i;

    notificationChannel = new NotificationChannel(CHANNEL_ID, CHANNEL_NAME, NotificationManager.IMPORTANCE_HIGH);
    notificationChannel.enableLights(true);
    notificationChannel.enableVibration(true);
    notificationChannel.setDescription("Your message");
    notificationChannel.setLightColor(Color.RED);
    notificationChannel.setSound(uri, attributes);
    notificationChannel.setLockscreenVisibility(Notification.VISIBILITY_PUBLIC);
    Nmanager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
    Nmanager.createNotificationChannel(notificationChannel);

}

大家好,我已经使用上面的代码解决了这个问题,而且它也能正常工作。你也可以直接将CHANNEL_ID = CHANNEL_ID+resID赋值。为此,我使用了变量i进行赋值。我已将用户选择的通知声音resID存储在SQLite数据库中,在createchannels类中,我使用光标检索该resID以创建uri路径。希望这能帮到您。谢谢...


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