uniapp如何让APP播放的音频跟随系统铃声模式

需求乍一眼看起来感觉很简单,但是上手一查阅资料才知道,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…

猜你喜欢

转载自blog.csdn.net/weixin_43905402/article/details/120009913