UNPKG

miue-ui

Version:

ali miniProgram UI components for vehicle.

250 lines (236 loc) 6.16 kB
/** * author:dansion@163.com * version:1.0.0 * data:2022-05-28 * - 针对阿里车载小程序容器背景音对象,兼容/优化。 * - 优化 startTime设置在src前面的。 * - 添加针对直播音源部份异常兼容。 * - 添加错误提示数据兼容。 * * 2023-04-25: * - 处理 duration 可能是 -1 的情况; * 2023-04-25 * - 优化src为空的情况; */ const _bgm = my.getBackgroundAudioManager() let _live=false; let _onTimeUpdateHandler=undefined; let _prevHandler=false; let _nextHandler=false; let _onSeekingHandler=undefined; let _onSeekedHandler=undefined; let _seek=(s)=>{ if(!_live){ _bgm.seek(s); }else{ //直播不支持seek(); } } let getDuration=()=>{ let _duration=_bgm.duration; // 当获取的值是非数字时,重置为0 if(Number.isNaN(parseInt(_duration))){ _duration=0; } // 当获取的值小于0 时,重置为 0 if(_duration<0){ return 0; } return _duration; /* if(!_live){ return _bgm.duration; }else{ //直播不支持duration; } */ } let getCurrentTime=()=>{ let _currentTime=_bgm.currentTime; // 当获取的值是非数字时,重置为0 if(Number.isNaN(parseInt(_currentTime))){ _currentTime=0; } //if(!_live){ return _currentTime; //}else{ //直播不支持currentTime; //} } let getLive=()=>{ //console.log("getLive()"); console.log(_live); return _live; } //针对开发者环境提醒 let _notice=(obj)=>{ if(my.isIDE){ if(!_prevHandler){ console.warn(`背景音模块:onPrev方法的回调函数,在车辆方向盘按健/系统媒体面板触发 <上一首> 的情况下无法响应。`); } if(!_nextHandler){ console.warn(`背景音模块:onNext方法的回调函数,在车辆方向盘按健/系统媒体面板触发 <下一首> 的情况下无法响应。`); } if(typeof(obj)=="string"){ console.warn(`BGM::直接赋值src的URL,如果是从头播放,建议先设置startTime=0, 推荐src={title:string,singer:string,img:string,startTime:0,src:string,live:true/false}`); } } } //是不是在直播状态 let _isLive=(url)=>{ if(url==true){ return true; }else{ if(typeof(url)=='string'){ if(url.indexOf('m3u8')>0){ return true; }else{ return false; } }else{ return false; } } } //判断网络是不是可用 const _isNetwork=()=>{ return new Promise(resolve=>{ my.getNetworkType({ success: (res) => { //res.hasNetworkType resolve(res.networkAvailable); } }); }) } const _src= async(obj)=>{ //todo:判断网络状态 let isNet=await _isNetwork(); //console.log('_src async...'); //console.log(isNet); // let _newsrc=''; if(typeof(obj)=="string"){ _live=_isLive(obj); _newsrc=obj; } if(typeof(obj)=="object"){ _bgm.title=obj.title; _bgm.singer=obj.singer; _bgm.coverImgUrl=obj.picture || obj.img; _bgm.startTime=obj.startTime?obj.startTime:0; _newsrc=obj.src; _live=_isLive(obj.src); } //如果URL不变化的,需要重置一下SRC,激活重新播放。 if(_bgm.src==_newsrc){ _bgm.src=''; } //当入参为src为空的情况; //console.log(`bgm _newsrc : ${_newsrc} , and _bgm.src: ${_bgm.src}`); if(_newsrc!=''){ _bgm.src=_newsrc; //异步不会自动播放,需要再次调用。 _bgm.play(); }else{ _bgm.src=_newsrc; // 兼容部份情况下,对src置空,并不生效的情况; _bgm.stop(); } //直播的资源,注册拖动回调函数。 if(_live){ if(_bgm.offSeeking){ _bgm.offSeeking(); } if(_bgm.offSeeked){ _bgm.offSeeked(); } } _notice(obj); } //定义返回对象初始化函数 const intBGM=()=>{ return { get duration(){return getDuration()}, get currentTime(){return getCurrentTime()}, get paused(){return _bgm.paused}, get buffered(){return _bgm.buffered}, get live(){return _live;}, //扩展 src 设置方法/提供obj入参方式/兼容因为src设置顺序带的BUG set src(obj){_src(obj);}, get src(){ // 模拟器情况下初始背景音频的src为空,不是 undefined(真机的值)。 if(_bgm.src==''){ return undefined; }else{ return _bgm.src; } }, set startTime(n){_bgm.startTime=n;}, get startTime(){return _bgm.startTime;}, set title(s){_bgm.title=s;}, get title(){return _bgm.title}, set singer(s){_bgm.singer=s;}, get singer(){return _bgm.singer;}, set coverImgUrl(s){_bgm.coverImgUrl=s;}, get coverImgUrl(){return _bgm.coverImgUrl; }, set webUrl(s){_bgm.webUrl=s;}, get webUrl(){return _bgm.webUrl;}, set playbackRate(s){ _bgm.playbackRate=s;}, get playbackRate(){return _bgm.playbackRate; }, //playbackRate seek:(f)=>{_seek(f);}, play:()=>{_bgm.play();}, pause:()=>{_bgm.pause();}, stop:()=>{_bgm.stop();}, onWaiting:(f)=>{ _bgm.onWaiting(f); console.warn(`注意::onWaiting是按顺序必定触发,谨慎使用`); }, onCanplay:(f)=>{ _bgm.onCanplay(f); }, onError:(f)=>{ _bgm.onError(f); //todo:可能和支付宝抛出的错误不一致,需要对齐 }, onPlay:(f)=>{ _bgm.onPlay(f); }, onPause:(f)=>{ _bgm.onPause(f); }, onSeeking:(f)=>{ _bgm.onSeeking(f); _onSeekingHandler=f; }, onSeeked:(f)=>{ _bgm.onSeeked(f); _onSeekedHandler=f; }, onStop:(f)=>{ _bgm.onStop(f); }, onTimeUpdate:(f)=>{ //将onTimeUpdate设置为单例模式,解决早期版本容器多页面注册带来内存溢出的问题。 if(_onTimeUpdateHandler!=undefined && _bgm.offTimeUpdate!=undefined){ _bgm.offTimeUpdate(); } _onTimeUpdateHandler=f; _bgm.onTimeUpdate(f); }, onEnded:(f)=>{ _bgm.onEnded(f); }, onNext:(f)=>{ _bgm.onNext(f); _nextHandler=true; }, onPrev:(f)=>{ _bgm.onPrev(f); _prevHandler=true; } } } export default intBGM();