需求乍一眼看起来感觉很简单,但是上手一查阅资料才知道,uniapp关于这些涉及底层类功能的调用知识真的是太少了!
一、uni.createInnerAudioContext()
一开始使用播放音频的方法是uni.createInnerAudioContext(),挂载到全局后指定src,在需要播放的时候调用。
但是,该方法并不支持跟随系统铃声模式,尽管官网API介绍有是否遵循系统静音开关,但是并没有什么卵用。
this.audioContext = uni.createInnerAudioContext();
this.audioContext.src = '/static/voice.mp3';
// obeyMuteSwitch默认值为true
// 在需要播放的地方,调用即可
this.audioContext.play();
二、plus.audio.createPlayer()
既然官方的API没有作用,那就只能使用plus了,这里使用到setSessionCategory方法。
同时,Android端还需要引入AudioManager类,用于判断当前系统的铃声模式。
iOS端具体可参考AVAudioSession.Category。
this.audioContext = plus.audio.createPlayer({
src: '/static/voice.mp3'
});
/**
* ambient模式在iOS端默认带有跟随系统铃声模式的行为,iOS端默认值为soloAmbient
* iOS端默认情况下为soloAmbient,但偶现有打开playback,即出现了之前静音模式下也播放铃声的问题
* ambient支持多音频混合,故不会打断正在播放的音乐
*/
this.audioContext.setSessionCategory('ambient');
// 判断平台如果是Android
if (this.platform == 'android') {
// 导入声音管理类(AudioManager提供对音量和铃声模式控制的访问)
let AudioManager = plus.android.importClass('android.media.AudioManager');
this.audioManager = new AudioManager();
}
// 播放的时候,iOS端可直接播放,因为ambient模式自带有跟随系统铃声模式的默认行为
// 但Android端需要判断系统的铃声模式来决定是否需要播放
if (this.platform == 'android') {
/**
* 获取当前手机的铃声模式
* 0. 林格模式,将沉默,不会振动。 (这会覆盖振动设置。)
* 1. 林肯模式,将沉默,并会振动。 (这会导致电话铃声总是振动,但是如果设置,通知振动只会振动。)
* 2. 铃声模式可能会发出声音并可能振动。 如果在更换此模式之前的音量可以听到,则会发出声音。 如果振动设置打开,它会振动。
*/
let status = this.audioManager.getRingerMode();
if (status === 2) {
// 铃声模式下才播放音频
this.audioContext.play();
}
return;
}
this.audioContext.play(); // iOS端直接播放
继续加油,Keep learning…