uniapp实现语音播放功能

代码 代码 1430 人阅读 | 0 人回复

<
需供面


  • 语音播放没有跟从体系铃声形式。
  • 语音播放撑持扬声器/听筒播放。
  • 扬声器形式下播放检测到距离接近需求息屏(防误触)并及时转换为听筒播放,距离阔别需明屏并转回扬声器播放。
  • 听筒形式下播放检测距离变革没有需求切换播放声讲,但距离接近需求息屏(防误触),距离阔别需求明屏。
阐发需供

起首明白一面,语音播放撑持扬声器/听筒播放,那便只能利用plus.audio.createPlayer去完成,而切换播放声讲,可使用plus.audio.createPlayer创立出去真例的setRoute()办法。
由3.4面需供,明白正在播放语音时需求增加距离监听器,那里可使用plus.proximity.watchProximity去及时监听装备接近距离。
最初一个接近息屏,阔别明屏的需供,先把前里的做了,再看看怎样完成吧。
完成

this.playMode:播放声讲(扬声器 0,听筒 1)
this.playState:play回调中播放参数

  • 距离监听器
  1. this.watchProximity = plus.proximity.watchProximity((distance) => {
  2.         /**
  3.          * iOS端靠近为0,阔别为Infinity
  4.          * Android端靠近为0,阔别为5
  5.          */
  6.         if (this.playMode === 0) {
  7.                 // 扬声器形式下,需求对声讲停止及时修正
  8.                 this.voicePlayer.pause();
  9.                 if (distance !== 0) {
  10.                         // 扬声器
  11.                         this.voicePlayer.setRoute(0);
  12.                 } else {
  13.                         // 听筒
  14.                         this.voicePlayer.setRoute(1);
  15.                 }
  16.                 this.voicePlayer.resume();
  17.         }
  18. });
复造代码

  • 初初化播放器
  1. this.voicePlayer = plus.audio.createPlayer({ src: &#39;xxx&#39; });
  2. this.voicePlayer.setRoute(this.playMode);
  3. // 监听天然播放完成
  4. this.voicePlayer.addEventListener(&#39;ended&#39;, () => {
  5.         // 烧毁正正在监听装备间隔的监听器
  6.         if (this.watchProximity) {
  7.                 plus.proximity.clearWatch(this.watchProximity);
  8.                 this.watchProximity = null;
  9.         }
  10.         console.log(&#39;播放终了了&#39;);
  11. });
  12. // 监听音频能够开端播放变乱
  13. this.voicePlayer.addEventListener(&#39;play&#39;, () => {
  14.         // 初次播放时会施行两次回调
  15.         if (this.playState !== 2) {
  16.                 // plus.audio.ROUTE_SPEAKER:扬声器 0
  17.                 // plus.audio.ROUTE_EARPIECE:听筒 1
  18.                 this.voicePlayer.setRoute(this.playMode);
  19.                 this.playState++;
  20.         }
  21. });
  22. // 监听音频播放毛病变乱
  23. this.voicePlayer.addEventListener(&#39;error&#39;, (err) => {
  24.         console.log(&#39;报错err&#39;, err);
  25.         // 烧毁正正在监听装备间隔的监听器
  26.         if (this.watchProximity) {
  27.                 plus.proximity.clearWatch(this.watchProximity);
  28.                 this.watchProximity = null;
  29.         }
  30. });
复造代码

  • 播放
  1. // 正在准确的处所挪用播放
  2. this.voicePlayer.play();
复造代码
播放后,发明语音正在iOS端,是默许存正在接近息屏,阔别明屏的征象(默许举动);可是Android端正在播放的时分,一直是明屏的,看去Android端借需求本人完成。
播放时,初初播放形式为扬声器形式,接近切换为听筒,阔别切换回扬声器,正在iOS端是能完善表示的,切换无提早;Android端切换是存正在提早的,幸亏提早没有影响播放。
播放时,初初播放形式为听筒形式,Android端第一次播放音频会存正在几秒钟的卡顿提早,且该卡顿是占播放工夫的,也便是道第一次播放时没有完好的,今朝也出有甚么比力好的计划处理(临时弃捐)。
Android端完成播放时接近息屏,阔别明屏

该怎样动手呢?专主查阅了plus险些一切的API,皆出有能找到相干的内乱容,看去又只能上Android民网找了。
间接上Android民网找跟电源相干的API,发明了PowerManager,正在此中找到了一个电仄形式PROXIMITY_SCREEN_OFF_WAKE_LOCK,具体以下:
155251whkyihc0hytvbdav.jpg

那没有便是我念要的谜底吗?当务之急,道干便干!
因为PowerManager电源办理类是属于齐局独一的,故利用也不克不及像播放音频那样马马虎虎new一个真例出去,他需求借助Android的主真例工具plus.android.runtimeMainActivity()去挪用获得。
this.platform: 当前脚机仄台
this.wakeLock:唤醒锁
  1. // Android端需求设置叫醒形式才气正在靠近传感器激活时封闭屏幕,iOS端自带了
  2. if (this.platform === &#39;android&#39;) {
  3.         let main = plus.android.runtimeMainActivity();
  4.         let Context = plus.android.importClass(&#39;android.content.Context&#39;);
  5.         let PowerManager = plus.android.importClass(&#39;android.os.PowerManager&#39;);
  6.         let pm = main.getSystemService(Context.POWER_SERVICE);
  7.         // 32代表PROXIMITY_SCREEN_OFF_WAKE_LOCK,叫醒锁定电仄:当靠近传感器激活时封闭屏幕
  8.         let status = pm.isWakeLockLevelSupported(PowerManager.PROXIMITY_SCREEN_OFF_WAKE_LOCK);
  9.         // 体系撑持该叫醒形式
  10.         if (status) {
  11.                 this.wakeLock = pm.newWakeLock(PowerManager.PROXIMITY_SCREEN_OFF_WAKE_LOCK, &#39;TAG&#39;);
  12.                 this.wakeLock.acquire();
  13.         }
  14. }
复造代码
正在方才初初化播放器时增加的监听变乱中,增长对唤醒形式资本的开释
  1. // 监听天然播放完成
  2. this.voicePlayer.addEventListener(&#39;ended&#39;, () => {
  3.         // 烧毁正正在监听装备间隔的监听器
  4.         if (this.watchProximity) {
  5.                 plus.proximity.clearWatch(this.watchProximity);
  6.                 this.watchProximity = null;
  7.         }
  8.         // 开释叫醒锁
  9.         if (this.wakeLock) {
  10.                 this.wakeLock.release();
  11.                 this.wakeLock = null;
  12.         }
  13.         console.log(&#39;播放终了了&#39;);
  14. });
  15. // 监听音频播放毛病变乱
  16. this.voicePlayer.addEventListener(&#39;error&#39;, (err) => {
  17.         console.log(&#39;报错err&#39;, err);
  18.         // 开释叫醒锁
  19.         if (this.wakeLock) {
  20.                 this.wakeLock.release();
  21.                 this.wakeLock = null;
  22.         }
  23.         // 烧毁正正在监听装备间隔的监听器
  24.         if (this.watchProximity) {
  25.                 plus.proximity.clearWatch(this.watchProximity);
  26.                 this.watchProximity = null;
  27.         }
  28. });
复造代码
至此,一切的需供皆美满完成了!
总结

跟着对uniapp的深化理解,愈来愈多功用面的完成,开拓职员没有行需求把视角放正在前端,借需求转战到Android、iOS民圆查阅相干的API文档才华完成。
根据那个趋向,专主以为但凡脚机体系底层完成了的功用,但uniapp已完成的,皆能够经由过程plus.android大要plus.ios经由过程挪用相干功用类去完成,那泥潭算是越陷越深了。
总而行之,Keep learning…

免责声明:假如进犯了您的权益,请联络站少,我们会实时删除侵权内乱容,感谢协作!
1、本网站属于个人的非赢利性网站,转载的文章遵循原作者的版权声明,如果原文没有版权声明,按照目前互联网开放的原则,我们将在不通知作者的情况下,转载文章;如果原文明确注明“禁止转载”,我们一定不会转载。如果我们转载的文章不符合作者的版权声明或者作者不想让我们转载您的文章的话,请您发送邮箱:Cdnjson@163.com提供相关证明,我们将积极配合您!
2、本网站转载文章仅为传播更多信息之目的,凡在本网站出现的信息,均仅供参考。本网站将尽力确保所提供信息的准确性及可靠性,但不保证信息的正确性和完整性,且不对因信息的不正确或遗漏导致的任何损失或损害承担责任。
3、任何透过本网站网页而链接及得到的资讯、产品及服务,本网站概不负责,亦不负任何法律责任。
4、本网站所刊发、转载的文章,其版权均归原作者所有,如其他媒体、网站或个人从本网下载使用,请在转载有关文章时务必尊重该文章的著作权,保留本网注明的“稿件来源”,并自负版权等法律责任。
回复 关闭延时

使用道具 举报

 
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则