首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么我得不到通知声音(NotificationCompat.Builder) SDK26+

在Android开发中,通知声音是通过NotificationCompat.Builder类来实现的。在SDK26及以上的版本中,通知声音的获取方式有所改变。

在SDK26之前,我们可以通过设置NotificationCompat.Builder的setSound()方法来设置通知的声音。该方法接受一个Uri参数,可以是本地文件的Uri或者是资源文件的Uri。例如:

代码语言:txt
复制
NotificationCompat.Builder builder = new NotificationCompat.Builder(context)
        .setSound(Uri.parse("android.resource://" + context.getPackageName() + "/" + R.raw.notification_sound))
        .setContentTitle("Notification Title")
        .setContentText("Notification Content");

在SDK26及以上的版本中,通知声音的获取方式有所改变。现在,我们需要使用NotificationChannel来设置通知的声音。首先,我们需要创建一个NotificationChannel对象,并设置其重要性级别和声音。然后,将该NotificationChannel对象传递给NotificationCompat.Builder的setChannelId()方法。例如:

代码语言:txt
复制
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
    String channelId = "channel_id";
    CharSequence channelName = "Channel Name";
    int importance = NotificationManager.IMPORTANCE_DEFAULT;
    AudioAttributes audioAttributes = new AudioAttributes.Builder()
            .setUsage(AudioAttributes.USAGE_NOTIFICATION)
            .setContentType(AudioAttributes.CONTENT_TYPE_SPEECH)
            .build();
    NotificationChannel channel = new NotificationChannel(channelId, channelName, importance);
    channel.setSound(Uri.parse("android.resource://" + context.getPackageName() + "/" + R.raw.notification_sound), audioAttributes);
    
    NotificationManager notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
    notificationManager.createNotificationChannel(channel);
    
    NotificationCompat.Builder builder = new NotificationCompat.Builder(context, channelId)
            .setContentTitle("Notification Title")
            .setContentText("Notification Content");
}

在上述代码中,我们创建了一个名为"channel_id"的NotificationChannel,并设置了其重要性级别为默认。然后,我们使用setSound()方法设置了通知的声音,并使用setContentType()方法设置了声音的内容类型为语音。最后,我们将该NotificationChannel对象传递给NotificationCompat.Builder的setChannelId()方法。

这样,我们就可以在SDK26及以上的版本中设置通知的声音了。需要注意的是,为了兼容SDK26以下的版本,我们可以在创建NotificationChannel之前添加以下代码:

代码语言:txt
复制
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
    // 创建NotificationChannel
}
else {
    // 不需要创建NotificationChannel
}

推荐的腾讯云相关产品和产品介绍链接地址:

  • 云服务器(CVM):https://cloud.tencent.com/product/cvm
  • 云数据库 MySQL 版:https://cloud.tencent.com/product/cdb_mysql
  • 云原生容器服务(TKE):https://cloud.tencent.com/product/tke
  • 人工智能开发平台(AI Lab):https://cloud.tencent.com/product/ailab
  • 物联网开发平台(IoT Explorer):https://cloud.tencent.com/product/iothub
  • 移动推送服务(信鸽):https://cloud.tencent.com/product/tpns
  • 云存储(COS):https://cloud.tencent.com/product/cos
  • 腾讯区块链服务(TBaaS):https://cloud.tencent.com/product/tbaas
  • 腾讯云游戏引擎(GSE):https://cloud.tencent.com/product/gse
  • 腾讯云直播(CSS):https://cloud.tencent.com/product/css
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

  • Android 8.0无法发送通知栏?通知栏适配通知渠道

    不得不说Andoird的通知栏相比于IOS在使用上有着明显的不足,不仅是体验上的差异,还有大量的非关注通知铺满了通知栏,导致通知栏混乱,杂多。   为什么一个很好的通知栏功能现在却变得这么遭用户讨厌?很大一部分原因都是因为开发者没有节制地使用导致的。每个开发者都只想着尽可能地去宣传自己的App,最后用户的手机就乱得跟鸡窝一样了。但是通知栏又还是有用处的,比如我们收到微信、短信等消息的时候,确实需要通知栏给我们提醒。因此分析下来,通知栏目前最大的问题就是,无法让用户对感兴趣和不感兴趣的消息进行区分。就比如说,我希望淘宝向我推送卖家发货和物流的相关消息,但是我不想收到那些打折促销或者是让我去买衣服的这类消息。那么就目前来说,是没有办法对这些消息做区分的,我要么同意接受所有消息,要么就屏蔽所有消息,这是当前通知栏的痛点。   那么在Android 8.0系统中,Google也是从这个痛点开始下手的。

    01
    领券