Проблема: моему приложению нужны уведомления, которые может настроить пользователь. например. установить разные звуки, заголовки, тексты для уведомлений
Проблема: я знаю, что каналы уведомлений устанавливаются только один раз и не могут быть изменены, поэтому я подумал, что могу просто использовать переменные, однако даже с переменными после того, как я выбрал звук, он остается тем же звуком и вообще не может быть изменен. Единственное решение, которое я могу придумать, это новый канал каждый раз, когда что-то меняется, что кажется глупым. Наверняка есть другой способ??
Кроме того, чтобы добавить ко всему этому, на Android Pie звук уведомлений вообще не работает, я не могу понять, почему.
Uri soundUri = Uri.parse(notificationSound);
NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this, "CH_ID")
.setSmallIcon(R.mipmap.ic_launcher)
.setContentTitle(customTextTitle)
.setContentText(customTextBody)
.setAutoCancel(true)
.setSound(soundUri)
.setContentIntent(pendingIntent);
NotificationManager mNotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) {
if (soundUri != null){
// Changing Default mode of notification
notificationBuilder.setDefaults(Notification.DEFAULT_VIBRATE);
// Creating an Audio Attribute
AudioAttributes audioAttributes = new AudioAttributes.Builder()
.setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION)
.setUsage(AudioAttributes.USAGE_ALARM)
.build();
// Creating Channel
NotificationChannel notificationChannel = new NotificationChannel("CH_ID","Testing_Audio",NotificationManager.IMPORTANCE_HIGH);
notificationChannel.setSound(soundUri,audioAttributes);
mNotificationManager.createNotificationChannel(notificationChannel);
}
}
mNotificationManager.notify(0, notificationBuilder.build());
}
Спасибо, потому что у пользователя может быть так много разных звуков, что мне кажется, что новый канал каждый раз может стать действительно чрезмерным. (Для пользователей, которые могут их использовать и могут выглядеть ошибочными)
Идея канала состоит в том, чтобы позволить пользователю управлять уведомлениями. У вас может быть только ограниченное количество типов уведомлений.




у вас неправильно реализовано, установите звук, как показано ниже
notificationBuilder.setSound(soundUri,audioAttributes);
Я пробовал это, но builder.setSound не позволяет мне добавлять аудиоатрибуты, которые он запрашивает для int. Звук работает по-другому, но он просто застревает как этот конкретный звук без настройки пользователем.
Я решил проблему, хотя и хакерским способом :( В итоге я установил для звука значение null, если >= Oreo, и использовал медиаплеер для воспроизведения звука уведомления, а также установил для audioStream значение STREAM_NOTIFICATION. Очевидно, что это не идеально, но поскольку это уведомление и не сигнал тревоги, звук не должен превышать время, установленное для выполнения задачи во время onReceive.
Единственная проблема, которую я вижу в этом решении, заключается в том, что пользователь решит отключить уведомление/настроить канал на своем телефоне. Отключение звука там, очевидно, не повлияет на звук, воспроизводимый медиаплеером, и, скорее всего, в любом случае будет отображаться как отсутствие звука, что, к сожалению.
try {
mp.setDataSource(context.getApplicationContext(), soundUri);
mp.setAudioStreamType(AudioManager.STREAM_NOTIFICATION);
mp.prepare();
mp.start();
} catch (Exception e) {
//exception caught in the end zone
}
Для всех, у кого есть эта проблема, я нашел здесь действительно отличный пост, который является тем же решением, что и мое, но более надежным и более глубоким. Android O – Каналы уведомлений – Изменение шаблона вибрации или типа звука
несколько звуков должны поддерживаться несколькими каналами. Создайте другой канал на основе разных звуков.