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

Posted

技术标签:

【中文标题】如何在 Android O 中动态更改通知声音【英文标题】:How to change notification sound dynamically in Android O 【发布时间】:2018-09-11 08:02:17 【问题描述】:

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

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

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

有什么好的解决办法吗?

【问题讨论】:

请注意,如果您重复使用通知通道名称,#2 不起作用:它只是将通道恢复为您删除之前的状态。 【参考方案1】:

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

【讨论】:

但我们想为我们的应用使用自定义声音,而不是谷歌设备提供的铃声。正如我所说,用户可以从列表中选择他们最喜欢的铃声。 (这些声音之前是由我们的用户语音录制的)。我知道为什么 google 会引入通知渠道,但不明白为什么他们不允许动态修改 setSound。 您添加到the ringtone directory 的任何铃声都将自动可供选择。频道的设置在创建后归用户所有 - 他们是直接在单个集中式系统 UI 中选择重要性级别(即您的通知是否发出声音)和声音的人。 一些用户抱怨他们的手机系统通知设置缺少改变声音的选项。我收到了来自三星 A5、华为荣耀 View 10、华为荣耀 9 的快照,使用 GMail 通知设置按钮演示了这一点。有人遇到过吗? @mdicosimo 是的,我试过华为nova,小米PAD 4,用户只能开/关声音,不能选择不同的铃声。 如果假设我有 20 种声音可供用户选择,那么最佳做法是什么?我应该复制铃声文件夹中的所有内容,与其他应用程序和用户 SDCard 混淆吗?我希望这些声音保留在我的应用程序内部。【参考方案2】:

@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 的路径。希望这会帮助你谢谢...

【讨论】:

以上是关于如何在 Android O 中动态更改通知声音的主要内容,如果未能解决你的问题,请参考以下文章

如何在应用内更改通知声音(Flutter)

Android:如何使用声音资源包含通知声音?

如何使用来自 iPod 库的声音更改 iPhone 的通知声音

如何设置带有声音/振动和按钮徽标更改的通知?

在 iOS Flutter 中更改通知声音

如何在 Android + GCM 中获得带有声音 + 自定义应用程序图标的推送通知