我在更新 Android Oreo 中一个通道的通知声音时遇到了一些问题。我知道用户可以通过打开应用程序通知屏幕手动设置声音,但我想通过在默认设置活动中使用 RingtonePreference 来以编程方式进行此操作(用户能够从我的应用程序内部的活动中选择通知声音)。
问题是,第一个发送到应用程序的通知会从 PreferenceManager.getDefaultSharedPreferences() 中获取默认的声音值,并且在手动更改为其他媒体(使用 RingtonePreference 屏幕)之后,它仍将播放最初在该通道上创建的声音,而不是用户选择的新声音。
我不明白为什么 NotificationChannel 声音没有根据新的声音值进行更新,因为我正在做这样的事情:
NotificationChannel mChannel = new NotificationChannel(id, title, importance); mChannel.setSound(ringtoneUri, audioAttributes);
以下是完整代码:
问题是,第一个发送到应用程序的通知会从 PreferenceManager.getDefaultSharedPreferences() 中获取默认的声音值,并且在手动更改为其他媒体(使用 RingtonePreference 屏幕)之后,它仍将播放最初在该通道上创建的声音,而不是用户选择的新声音。
我不明白为什么 NotificationChannel 声音没有根据新的声音值进行更新,因为我正在做这样的事情:
NotificationChannel mChannel = new NotificationChannel(id, title, importance); mChannel.setSound(ringtoneUri, audioAttributes);
以下是完整代码:
public static void sendNotification(Context context, NotificationType notificationType) {
String id = "channel_1"; // default_channel_id
String title = "Doppler Channel"; // Default Channel
Intent intent;
PendingIntent pendingIntent;
NotificationCompat.Builder builder;
SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context);
Uri ringtoneUri = Uri.parse(preferences.getString("notifications_new_message_ringtone", "DEFAULT_RINGTONE_URI"));
boolean isNotificationSticky = !Boolean.parseBoolean(preferences.getAll().get("stickyNotification").toString());
AudioAttributes audioAttributes = new AudioAttributes.Builder()
.setUsage(AudioAttributes.USAGE_NOTIFICATION)
.build();
NotificationManager notifManager = (NotificationManager)context.getSystemService(Context.NOTIFICATION_SERVICE);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
int importance = NotificationManager.IMPORTANCE_DEFAULT;
NotificationChannel mChannel = notifManager.getNotificationChannel(id);
mChannel = new NotificationChannel(id, title, importance);
mChannel.setSound(ringtoneUri, audioAttributes);
notifManager.createNotificationChannel(mChannel);
builder = new NotificationCompat.Builder(context, id);
intent = new Intent(context, MainActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
pendingIntent = PendingIntent.getActivity(context, 0, intent, 0);
builder .setSmallIcon(notificationType.getNotificationIcon())
.setContentTitle(notificationType.getNotificationContent())
.setSubText(notificationType.getNotificationTitle())
.setOnlyAlertOnce(true)
.setOngoing(isNotificationSticky)
.setAutoCancel(true)
.setSound(ringtoneUri)
.setColor(notificationType.getNotificationColor())
.setContentIntent(pendingIntent);
}
Notification notification = builder.build();
notifManager.notify(1, notification);
}
我唯一能够更新声音的方法是每次通知被触发时,给频道ID赋一个随机值UUID.randomUUID().toString()
,但这会在用户手动检查应用程序通知屏幕时产生大量垃圾。
对此的提示将不胜感激。
非常感谢!