You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用getStream.io开发Android聊天模块:自定义通知音效设置失败求助

Android端getStream.io自定义通知音效不生效解决方案

针对你使用getStream.io实现聊天模块时,Android端无法设置自定义通知音效的问题,按以下步骤排查和解决:

1. 确认音效文件的正确配置

  • 将自定义音效文件(如notification_sound.wav)放置在Android项目的res/raw目录下
  • 文件名必须全小写,不能包含空格、特殊字符(可使用下划线),避免出现大写字母
  • 确保音效格式兼容Android:推荐使用WAV、MP3,编码需符合Android音频规范

2. 调整推送通知模板的sound字段

修改Android通知模板中的sound字段,去掉文件后缀,示例如下:

{
  "title": "New message from {{ sender.name }}",
  "body": "{{ truncate message.text 2000 }}",
  "sender": "stream.chat",
  "type": "message.new",
  "version": "v2",
  "message_id": "{{ message.id }}",
  "id": "{{ message.id }}",
  "channel_type": "{{ channel.type }}",
  "cid": "{{ channel_cid }}",
  "channel_id": "{{ channel.id }}",
  "sound": "notification_sound" // 去掉.wav后缀
}

原因:Android通过R.raw资源引用文件时不需要后缀,getStream SDK处理时会对应查找raw目录下的资源。

3. 自定义Android端通知处理逻辑

getStream默认的通知处理器不会自动应用自定义音效,需要实现自定义NotificationHandler覆盖默认行为:

自定义NotificationHandler示例(Kotlin)

import android.app.NotificationChannel
import android.app.NotificationManager
import android.content.Context
import android.media.AudioAttributes
import android.net.Uri
import android.os.Build
import androidx.core.app.NotificationCompat
import androidx.core.app.NotificationManagerCompat
import io.getstream.chat.android.client.notifications.NotificationHandler

class CustomChatNotificationHandler : NotificationHandler {
    override fun handleNotification(context: Context, payload: Map<String, String>) {
        val soundName = payload["sound"] ?: return
        // 构建自定义音效的Uri
        val soundUri = Uri.parse("android.resource://${context.packageName}/raw/$soundName")
        val channelId = "stream_chat_notification_channel"

        // Android O及以上必须配置通知渠道
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            val audioAttributes = AudioAttributes.Builder()
                .setUsage(AudioAttributes.USAGE_NOTIFICATION)
                .setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION)
                .build()

            val notificationChannel = NotificationChannel(
                channelId,
                "Chat Notifications",
                NotificationManager.IMPORTANCE_HIGH
            ).apply {
                setSound(soundUri, audioAttributes)
                enableVibration(true)
            }

            val notificationManager = context.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
            notificationManager.createNotificationChannel(notificationChannel)
        }

        // 构建通知并设置音效
        val notificationBuilder = NotificationCompat.Builder(context, channelId)
            .setSmallIcon(R.drawable.ic_chat_notification) // 替换为你的通知图标
            .setContentTitle(payload["title"])
            .setContentText(payload["body"])
            .setPriority(NotificationCompat.PRIORITY_HIGH)
            .setSound(soundUri)
            .setAutoCancel(true)

        // 显示通知
        NotificationManagerCompat.from(context).notify(
            payload["message_id"]?.hashCode() ?: 0,
            notificationBuilder.build()
        )
    }
}

注册自定义处理器

在Application类的onCreate方法中注册该处理器:

import android.app.Application
import io.getstream.chat.android.client.ChatClient

class MyApplication : Application() {
    override fun onCreate() {
        super.onCreate()
        // 初始化Stream Chat
        val apiKey = "YOUR_STREAM_API_KEY"
        val client = ChatClient.Builder(apiKey, this).build()
        
        // 设置自定义通知处理器
        client.setNotificationHandler(CustomChatNotificationHandler())
    }
}

4. 排查通知渠道的音效设置

  • Android O及以上版本,通知渠道的音效设置会覆盖单个通知的音效,确保创建渠道时正确绑定了自定义音效
  • 如果之前已创建过同名通知渠道,需卸载应用重新安装(渠道创建后默认无法修改,除非代码中主动更新渠道配置)

内容的提问来源于stack exchange,提问作者Ahmed Khattab

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 12:40:50