NotificationManagerCompat на Android Oreo

Есть ли способ установить каналы на Android Oreo при использовании NotificationManagerCompat и NotificationCompat?

Ответ 1

Поскольку NotificationManagerCompat - это просто класс-оболочка, который облегчает жизнь, вы можете создавать каналы обычно:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
    val name = getString(R.string.channel_title)
    val description = getString(R.string.channel_description)
    val importance = NotificationManager.IMPORTANCE_HIGH
    val mChannel = NotificationChannel(CHANNEL_ID, name, importance)
    mChannel.description = description
    mChannel.enableLights(true)
    mChannel.lightColor = Color.parseColor("#5B3C88")
    mChannel.enableVibration(true)
    mChannel.vibrationPattern = longArrayOf(100, 200, 300, 400, 500, 400, 300, 200, 400)
    val manager = (context.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager)
    manager.createNotificationChannel(mChannel)
}

И затем используйте NotificationManagerCompat при отправке уведомлений, но не забудьте создать уведомление с использованием нового конструктора:

NotificationCompat.Builder(context, CHANNEL_ID)

Ответ 2

Обычно я использую этот класс для управления каналами уведомлений:

class NotificationManager(private val context: Context) {

    companion object {
        private val CHANNEL_ID = "YOUR_CHANNEL_ID"
        private val CHANNEL_NAME = "Your human readable notification channel name"
        private val CHANNEL_DESCRIPTION = "description"
    }

    @RequiresApi(Build.VERSION_CODES.O)
    fun getMainNotificationId(): String {
        return CHANNEL_ID
    }

    @RequiresApi(Build.VERSION_CODES.O)
    fun createMainNotificationChannel() {
            val id = CHANNEL_ID
            val name = CHANNEL_NAME
            val description = CHANNEL_DESCRIPTION
            val importance = android.app.NotificationManager.IMPORTANCE_LOW
            val mChannel = NotificationChannel(id, name, importance)
            mChannel.description = description
            mChannel.enableLights(true)
            mChannel.lightColor = Color.RED
            mChannel.enableVibration(true)
            val mNotificationManager = context.getSystemService(Context.NOTIFICATION_SERVICE) as android.app.NotificationManager
            mNotificationManager.createNotificationChannel(mChannel)
    }
}

Тогда вы можете использовать так, как это

fun createNotificationCompatBuilder(context: Context): NotificationCompat.Builder {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
        return NotificationCompat.Builder(context, NotificationManager(context).mainNotificationId)
    } else {
        return NotificationCompat.Builder(context)
    }
}

Таким образом, вы можете использовать его в любом месте приложения с подписью, как и раньше, и можете легко изменить его в случае будущих изменений.

Ответ 3

  Есть ли способ настроить каналы на Android Oreo при использовании NotificationManagerCompat?

NotificationManagerCompat теперь поддерживает каналы уведомлений. В новой версии добавлены методы каналов уведомлений в NotificationManagerCompat, поэтому разработчики могут использовать только NotificationManagerCompat при работе с уведомлениями.

Для Java включите в файл build.gradle следующее

implementation 'androidx.core:core:1.1.0'

Для Kotlin, включите следующее вместо вышеуказанной зависимости в файл build.gradle

implementation 'androidx.core:core-ktx:1.1.0'

Чтобы отобразить уведомление, вам нужно будет сделать следующее

  1. Создать и зарегистрировать канал уведомлений.
  2. Создайте уведомление.
  3. Показать уведомление

Приведенные ниже фрагменты приведены в Kotlin, но вы также можете использовать Java, если хотите.

1. Создайте и зарегистрируйте канал уведомлений.

Каналы уведомлений обеспечивают общий визуальный и слуховой опыт для уведомлений аналогичного типа. С момента их введения в API 26 теперь вам необходимо установить канал для уведомления, иначе они не будут отображаться в более новых версиях Android.

Поэтому определите вспомогательный метод, как показано ниже, чтобы создать для вас канал уведомлений.

//define your channel id
val CHANNEL_ID = "com.yourpackagename.your_channel_id"

//create notification channel for android Oreo and above devices.
if (Build.VERSION.SDK_INT >= 26) {
    val channel = NotificationChannel(CHANNEL_ID , "Your channel name", NotificationManager.IMPORTANCE_DEFAULT)
    NotificationManagerCompat.from(this).createNotificationChannel(channel)
}

2. Создайте уведомление.

Используйте NotificationCompat.Builder, чтобы создать Notificaiton. Обратите внимание, что CHANNEL_ID передается разработчику.

var builder = NotificationCompat.Builder(this, CHANNEL_ID)
    .setSmallIcon(R.drawable.notification_icon)
    .setContentTitle("My notification")
    .setContentText("Much longer text that cannot fit one line...")
    .setStyle(NotificationCompat.BigTextStyle()
            .bigText("Much longer text that cannot fit one line..."))
    .setPriority(NotificationCompat.PRIORITY_DEFAULT)

3. Показать уведомление

Чтобы сделать уведомление, позвоните NotificationManagerCompat.notify(), передав ему уникальный идентификатор для уведомления и результат NotificationCompat.Builder.build()

   NotificationManagerCompat.from(this).notify(notificationId, builder.build())

Это все :)