如何在 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 中动态更改通知声音的主要内容,如果未能解决你的问题,请参考以下文章