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
相关产品推荐
相关产品推荐

