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

Wear OS:非通知事件下播放提示音的正确实现方案

在Wear OS非通知事件中播放类通知提示音的正确姿势

嘿,刚好踩过这个坑!Android 8.0(API 26)之后,AudioManager.STREAM_RING这类流类型常量就被官方标记为过时了,现在推荐用AudioAttributes来定义音频的用途和类型,这样系统能更智能地处理音频路由(比如Wear设备连接蓝牙耳机时自动切换),也更符合现代Android的音频策略。

下面给你一步步讲正确的实现方式:

核心思路:用AudioAttributes替代过时的流类型

AudioAttributes可以明确告诉系统你播放的音频是做什么用的——比如我们需要的类通知提示音,就指定USAGE_NOTIFICATION,系统会自动套用通知音频的相关规则(比如遵守静音模式、音量控制逻辑等)。

1. 初始化AudioAttributes

先构建一个符合通知场景的AudioAttributes实例:

AudioAttributes audioAttributes = new AudioAttributes.Builder()
        // 指定用途为通知类音频
        .setUsage(AudioAttributes.USAGE_NOTIFICATION)
        // 指定内容类型为提示音(区别于音乐、语音等)
        .setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION)
        .build();

如果你的提示音是更具体的事件通知(比如提醒、警告),也可以用USAGE_NOTIFICATION_EVENT,效果类似。

2. 结合MediaPlayer播放音频

不管是用自定义的提示音资源,还是系统默认的通知音,都可以搭配上面的AudioAttributes来播放:

播放自定义raw资源里的提示音

// 从raw目录加载音频(替换成你的资源ID)
MediaPlayer mediaPlayer = MediaPlayer.create(context, R.raw.notification_tone);
// 设置AudioAttributes
mediaPlayer.setAudioAttributes(audioAttributes);
// 开始播放
mediaPlayer.start();

// 记得播放完成后释放资源,避免内存泄漏
mediaPlayer.setOnCompletionListener(mp -> mp.release());

播放系统默认通知音

如果想调用系统自带的通知提示音,可以用RingtoneManager获取默认URI:

Uri defaultToneUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
MediaPlayer mediaPlayer = MediaPlayer.create(context, defaultToneUri);
mediaPlayer.setAudioAttributes(audioAttributes);
mediaPlayer.start();
mediaPlayer.setOnCompletionListener(mp -> mp.release());

3. Wear OS的额外注意事项

  • 穿戴设备可能处于静音模式或者连接了蓝牙音频设备,使用AudioAttributes后,系统会自动处理这些场景(比如静音时不播放,蓝牙连接时路由到耳机),不用自己额外判断。
  • 如果你的应用需要频繁播放短提示音,也可以考虑用SoundPool,它更适合低延迟的短音频播放,用法类似,同样需要设置AudioAttributes。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 07:30:18