机器人13

使用自定义声音创建本地通知

我的res/raw/event_sound.mp3中有Event_sound.mp3

我收到以下通知

val notification = NotificationCompat.Builder(context, channelId)
    .setContentTitle(title)
    .setContentText(description)
    .setSmallIcon(R.drawable.bell)
    .setAutoCancel(true)
    .setContentIntent(pendingIntent)
    .setSound(getUriSoundFile(context))
    .build()

我有以下方法来提取我的数据模块中的声音文件.

 private fun getUriSoundFile(context: Context): Uri {
        val uri = Uri.parse("android.resource://" + "me.androidbox.data" + "/raw/" + "event_sound.mp3")

        return uri
    }

当我判断完整路径时,我得到以下结果:

android.resource://me.androidbox.data/raw/event_sound.mp3

我在我的应用程序类中设置了如下频道:

  private fun createNotificationChannel(listOfChannel: Map<String, String>) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            listOfChannel.map { mapOfChannel ->
                val notificationManager = getNotificationManager()
                val notificationChannel = NotificationChannel(
                    mapOfChannel.key,
                    mapOfChannel.value,
                    NotificationManager.IMPORTANCE_HIGH
                )

                notificationManager.createNotificationChannel(notificationChannel)
            }
        }
    }

然而,通知只会发出默认的声音,而不会播放我的自定义声音.

==引用=外部链接==

在我的应用程序课上,我有以下内容.EVENT_SOUND直接出现在以下内容中

raw/event_sound.mp3

这是调试输出 android.resource://me.androidbox.presentation/2131558400

这是我的更新代码:

private fun createNotificationChannel(listOfChannel: Map<String, String>) {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
        listOfChannel.map { mapOfChannel ->
            val notificationManager = getNotificationManager()
            val notificationChannel = NotificationChannel(
                mapOfChannel.key,
                mapOfChannel.value,
                NotificationManager.IMPORTANCE_HIGH
            )

            val audioAttributes = AudioAttributes.Builder()
                .setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION)
                .setUsage(AudioAttributes.USAGE_NOTIFICATION_EVENT)
                .build()

            notificationChannel.setSound(getUriSoundFile(), audioAttributes)
            notificationManager.createNotificationChannel(notificationChannel)
        }
    }
}

推荐答案

Problem Description:在Android 13之后,无论在应用程序 Select 中,所有通知声音都设置为默认声音

确保您的通知声音为res/RAW中的mp3格式.

你可以让其他部分保持原样.

新答案


private fun getUriSoundFile(context: Context): Uri {
        val uri = Uri.parse(ContentResolver.SCHEME_ANDROID_RESOURCE + "://" + context.packageName + "/" + R.raw.event_sound.mp3)

        return uri
    }


private fun createNotificationChannel(listOfChannel: Map<String, String>) {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
        listOfChannel.map { mapOfChannel ->
            val notificationManager = getNotificationManager()
            val notificationChannel = NotificationChannel(
                mapOfChannel.key,
                mapOfChannel.value,
                NotificationManager.IMPORTANCE_HIGH
            )

            val audioAttributes = AudioAttributes.Builder()
                .setUsage(AudioAttributes.USAGE_NOTIFICATION)
                .build()

            notificationChannel.setSound(getUriSoundFile(), audioAttributes)
            notificationManager.createNotificationChannel(notificationChannel)
        }
    }
}

老答案

private fun createNotificationChannel() {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
                val audioAttributes = AudioAttributes.Builder()
                    .setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION)
                    .setUsage(AudioAttributes.USAGE_NOTIFICATION_EVENT)
                    .build()
    
                val uri = Uri.parse("android.resource://$packageName/${R.raw.sample_sound}")
    
                val channel = NotificationChannel(
                    CHANNEL_ID,
                    "Channel Name",
                    NotificationManager.IMPORTANCE_DEFAULT
                ).apply {
                    description = "Description"
                    setSound(uri, audioAttributes)
                }
                val notificationManager =
                    getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
                notificationManager.createNotificationChannel(channel)
            }
        }

Android相关问答推荐

ENV变量在gradle进程中没有更新

在Jetpack Compose中,material 3 Textfield上的底部边框 colored颜色 是如何更改的?

Composable不会以LocalConext.Current作为活动呈现

OverridePendingTransition已弃用,我该怎么办?

设置文本 colored颜色 动画时如何减少重新组合?

在Jetpack Compose中,我可以配置动画以恒定的速度而不是恒定的时间运行吗?

在c中更新MVVMCross中TextView的Alpha#

如何显示具体的商品数量?

如何在 Jetpack Compose LazyColumn 中将项目分组在一起,例如卡片

Android Compose - 为什么 Canvas 中的drawText在底部被切断而不是在顶部?

如何在 kotlin 中接收带有和不带有可空对象的集合并保持引用相同

为一组闪烁的可组合项制作动画,控制同步/定时

在单元测试下断言协程未完成

通过 adb 解压并重新安装后 Android 应用程序崩溃

系统导航栏在某些场景下应用了深色效果

如何将一个 Composable 作为其参数传递给另一个 Composable 并在 Jetpack Compose 中显示/运行它

Compose `Icons.Outlined.Star` 没有概述

如何在 Jetpack compose 中将 Canvas 中的文本居中?

如何在 Compose 中更改高程 colored颜色 ?

WindowManager 内的 RecyclerView 不更新