Cześć,
nie będę oszukiwał i przyznam się od razu, że nie mam żadnego doświadczenia w programowaniu aplikacji mobilnych. Potrzebuję jednak napisać prosty program który wyświetli powiadomienia przychodzące na Firebase. Udało mi się stworzyć prostą aplikację w Kotlin. Powiadomienia są poprawnie obsługiwane jednak chciałbym rozróżnić 2 typy powiadomień:
- Alarm - przychodzące powiadomienie powinno uruchomić wcześniej skonfigurowany dźwięk alarmu i działać z pominięciem trybu "nie przeszkadzać"
- Powiadomienie - standardowe powiadomienie które może być obsłużone nawet bez dźwięku
Udało mi się ustawić obydwa powiadomienia ale działa to tylko wtedy dgy utrzymuję aplikację uruchomioną. Gdy tylko ją zminimalizuję/zamknę powiadomienie przychodzi tylko z dźwiękiem skonfigurowanym jako:
<meta-data
android:name="com.google.firebase.messaging.default_notification_channel_id"
android:value="@string/channel_name_notification" />
Najważniejsze funkcje:
private fun createNotificationChannel() {
val name = "MyHome Notification channel"
val descriptionText = getString(R.string.channel_description_notification)
val importance = NotificationManager.IMPORTANCE_DEFAULT
val soundUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION)
val audioAttributes = AudioAttributes.Builder()
.setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION)
.setUsage(AudioAttributes.USAGE_NOTIFICATION)
.build()
val channel = NotificationChannel(getString(R.string.channel_name_notification), name, importance).apply {
description = descriptionText
setSound(soundUri, audioAttributes)
enableVibration(true)
vibrationPattern = longArrayOf(1000, 1000, 1000, 1000, 1000)
}
val notificationManager = getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
notificationManager.createNotificationChannel(channel)
}
private fun createAlarmNotificationChannel() {
val name = "MyHome Alarm channel"
val descriptionText = getString(R.string.channel_description_alarm)
val importance = NotificationManager.IMPORTANCE_HIGH
val soundUri = Uri.parse(ContentResolver.SCHEME_ANDROID_RESOURCE + "://" + this.packageName + "/" + R.raw.alarm_sound)
val audioAttributes = AudioAttributes.Builder()
.setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION)
.setUsage(AudioAttributes.USAGE_ALARM)
.build()
val channel = NotificationChannel(getString(R.string.channel_name_alarm), name, importance).apply {
description = descriptionText
setSound(soundUri, audioAttributes)
enableVibration(true)
vibrationPattern = longArrayOf(1000, 1000, 1000, 1000, 1000)
}
channel.setBypassDnd(true)
val notificationManager = getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
notificationManager.createNotificationChannel(channel)
}
private fun sendNotification(title: String?, messageBody: String?) {
val intent = Intent(this, MainActivity::class.java).apply {
addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)
}
val pendingIntent = PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_ONE_SHOT or PendingIntent.FLAG_IMMUTABLE)
val isAlarm = title?.contains("Alarm!", ignoreCase = true) ?: false
val channelId = if (isAlarm) {
getString(R.string.channel_name_alarm)
} else {
getString(R.string.channel_name_notification)
}
Log.d(TAG, "Sending notification: Title: $title -> is alarm?: $isAlarm -> Channel ID: $channelId")
val soundUri = if (isAlarm) {
Uri.parse(ContentResolver.SCHEME_ANDROID_RESOURCE + "://" + this.packageName + "/" + R.raw.alarm_sound)
} else {
RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION)
}
val notificationBuilder = NotificationCompat.Builder(this, channelId)
.setSmallIcon(R.drawable.ic_notification)
.setContentTitle(title)
.setContentText(messageBody)
.setAutoCancel(true)
.setContentIntent(pendingIntent)
.setSound(soundUri)
val notificationManager = getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
notificationManager.notify(if (isAlarm) alarmId else notificationId, notificationBuilder.build())
}
companion object {
private const val TAG = "MyFirebaseMsgService"
}
Gdzieś wyczytałem, że po zminimalizowaniu aplikacji, android kasuje inne niż domyślny kanał powiadomień dla danej aplikacji więc można używać tylko jednego. Może jest jakiś prosty sposób żeby to rozwiązać?