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

时间:2018-04-02 05:07:30

标签: android audio notifications channel android-8.0-oreo

最近我使用通知频道来支持android O. 但问题是我无法动态改变声音Uri。 我们的应用程序具有通知声音设置,用户可以根据需要更改应用程序通知声音 但是如您所知,Android现在不允许开发人员在用户重新安装应用之前更新通知频道。 在那里,我考虑了几种可能不太好的解决方案。

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

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

  3. 有什么好的解决方案吗?

2 个答案:

答案 0 :(得分:7)

在Android O +设备上,您应移除应用中的所有通知特定设置,并在设置屏幕中提供open the system's notification channel settings的链接,用户可以直接调整通知频道的声音。

答案 1 :(得分:0)

@RequiresApi(api = Build.VERSION_CODES.O) 私有无效 createChannels() {

    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 的路径。希望这会对您有所帮助,谢谢...