代码之家  ›  专栏  ›  技术社区  ›  Steve Strates

当使用引用资源id的声音uri时,Android通知通道声音停止工作

  •  0
  • Steve Strates  · 技术社区  · 7 年前

    我们已经为运行在Oreo和更高版本上的设备创建了通知通道,这些设备使用位于我们系统中的自定义通知声音 /res/raw

    我们已确认卸载/重新安装或清除应用程序数据可以解决此问题。然而,为了让通知声音再次为每个人工作而不必重新安装,我们需要从本质上删除并重新创建这些频道。

    我们按如下方式创建通知通道:

    fun initNotificationChannel(channel: PSSNotificationChannel) {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
                val id = channel.id
                val name = context.getString(channel.nameResId)
                val importance = channel.importance
                val channel = NotificationChannel(id, name, importance)
    
                ...
    
                // Default sound
                val soundUri = Uri.parse(ContentResolver.SCHEME_ANDROID_RESOURCE + "://" +
                        context.applicationContext.packageName + "/" + R.raw.notification)
                val audioAttributes = AudioAttributes.Builder()
                        .setUsage(AudioAttributes.USAGE_NOTIFICATION)
                        .setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION)
                        .build()
                channel.setSound(soundUri, audioAttributes)
    
                val notificationManager = context.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager?
                notificationManager?.createNotificationChannel(channel)
            }
        }
    

    . 而导致这种情况的提交似乎只是一些添加/修改的文件 /res 文件夹。

    1 回复  |  直到 7 年前
        1
  •  5
  •   Steve Strates    7 年前

    看来这个问题 soundUri 具体如下:

    val soundUri = Uri.parse(ContentResolver.SCHEME_ANDROID_RESOURCE + "://" +
                        context.applicationContext.packageName + "/" + R.raw.notification)
    

    它看起来像是 R.raw.notification 2131689979 (声音工作的版本)到 2131755515 (声音不工作的版本)。既然你不能用通知频道来改变你的通知声音,我几乎可以肯定频道正在试图解决问题 soundUri公司 android.resource://our.package.name/2131689979 ).

    我认为更好的方法是直接按名称引用文件,如下所示:

    val soundUri = Uri.parse(ContentResolver.SCHEME_ANDROID_RESOURCE + "://" +
                        context.applicationContext.packageName + "/raw/notification")
    

    我还注意到像Facebook Messenger和Slack这样的应用程序使用一个公共通知文件夹,它们可能只是复制文件并引用确切的路径。这似乎还允许用户重新选择应用程序提供的声音,因为它在文件系统中可见。