资讯专栏INFORMATION COLUMN

【MUI】Android监听电话呼入呼出

I_Am / 2131人阅读

摘要:后台,锁屏,来电,都会自动暂停。得益于苹果的系统限制,以上情况下都会暂停音视频的播放。上下文通话管理获取实现回调函数监听电话状态注册监听等待接电话电话挂断通话中获取删除监听暴露出个方法,添加来电监听广播,以及删除。

序章

还记得吗?在前段时间,我们撸过了h5的video标签元素,和h5+的plus特性编写了一个小小的播放器。至今位置改了一些代码运用到了项目中,却发现出现了一个蛋疼的问题。

Android : 后台,锁屏,来电都不能自动暂停,哭瞎 T-T。
ios : 后台,锁屏,来电,都会自动暂停。得益于苹果的系统限制,以上情况下都会暂停音视频的播放。

搞起

先来分析一波,后台事件,5+的文档中早已出现过。

</>复制代码

  1. document.addEventListener("pause",function(){
  2. //code...
  3. //暂停播放
  4. });

这里需要跟大家提醒下document.addEventListener千万不要写成window.addEventListener因为我就写错了一次,我说怎么调试都不成功。哈哈

再来再来,下一个下一个,锁屏是吧,我一开始在官方文档中翻了一会儿并没有发现有这个事件,后来仔细想想,锁屏的时候,不就正是另一个叫做‘锁屏’的应用程序切换到了前台,而我们的App切换到了后台吗?
果不其然,不需要增加额外的事件,监听了上面的后台事件即可,也会触发。

SO,视频播放中,来电话了,视频并不会暂停? Excuse Me?如果是我还好,看一些美剧什么的(
强势推荐大家看:《闪电侠》

咳咳,要是别人在看一些那啥怎么办,orz 。这就很尴尬了,当初并没有想到Android来电不会自动暂停H5 video的播放。

一时间找文档也没有发现 来电事件

好吧,拿起Native.js大宝剑

1:打开 Native.js 文档 Native.js
2:打开 Native.js 范例 Native范例汇总
3:打开 baidu.com 搜索 关键字 android 来电监听

差不多就这些了,就算我这样不怎么懂原生的菜鸟,还是照葫芦画瓢,约摸着写出来点。

</>复制代码

  1. var Native = (function($) {
  2. var native = {};
  3. var receiver, main, context, TelephonyManager;
  4. native.listenTelPhone = function(callback) {
  5. $.plusReady(function() {
  6. context = plus.android.importClass("android.content.Context"); //上下文
  7. TelephonyManager = plus.android.importClass("android.telephony.TelephonyManager"); //通话管理
  8. main = plus.android.runtimeMainActivity(); //获取activity
  9. receiver = plus.android.implements("io.dcloud.feature.internal.reflect.BroadcastReceiver", {
  10. onReceive: doReceive //实现onReceiver回调函数
  11. });
  12. var IntentFilter = plus.android.importClass("android.content.IntentFilter");
  13. var Intent = plus.android.importClass("android.content.Intent");
  14. var filter = new IntentFilter();
  15. filter.addAction(TelephonyManager.ACTION_PHONE_STATE_CHANGED); //监听电话状态
  16. main.registerReceiver(receiver, filter); //注册监听
  17. });
  18. function doReceive(context, intent) {
  19. plus.android.importClass(intent);
  20. var phoneNumber = intent.getStringExtra(TelephonyManager.EXTRA_INCOMING_NUMBER),
  21. telephony = context.getSystemService(context.TELEPHONY_SERVICE),
  22. state = telephony.getCallState();
  23. switch(state) {
  24. case TelephonyManager.CALL_STATE_RINGING:
  25. callback && callback(1,phoneNumber);
  26. //console.log("[Broadcast]等待接电话=" + phoneNumber);
  27. break;
  28. case TelephonyManager.CALL_STATE_IDLE:
  29. callback && callback(0,phoneNumber);
  30. console.log("[Broadcast]电话挂断=" + phoneNumber);
  31. break;
  32. case TelephonyManager.CALL_STATE_OFFHOOK:
  33. callback && callback(2,phoneNumber);
  34. console.log("[Broadcast]通话中=" + phoneNumber);
  35. break;
  36. }
  37. }
  38. },
  39. native.removeListenTelPhone = function(){
  40. if(receiver){
  41. main = plus.android.runtimeMainActivity(); //获取activity
  42. main.unregisterReceiver(receiver); //删除监听
  43. receiver = null;
  44. }
  45. }
  46. return native;
  47. }(mui));

暴露出2个方法,添加来电监听广播,以及删除。

</>复制代码

  1. //监听电话 code 1来电 0挂断 2童话中 number 对方电话号码
  2. mui.os.android && Native.listenTelPhone(function(code, number) {
  3. if(code === 1) { //来电
  4. //暂停播放
  5. //code...
  6. }
  7. });
  8. //去除电话广播监听
  9. mui.os.android && Native.removeListenTelPhone();

嘿嘿嘿嘿,嘿嘿嘿嘿

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/80807.html

相关文章

  • Vue+websocket+stompjs 实时监控坐席状态demo

    摘要:之后坐席状态改变,可以看到有事件推送过来。关于的重连程序后服务端使用这里我直接引用我的另一个项目的部分代码,这个没有使用,直接使用浏览器原生的。重连的原理很简单,就是检测到断开时,去调用我的方法,这里我也做了重连的次数限制。 由于是前后端分离的demo, 程序的后端我不管,我只负责把前端做好,这只是个demo, 还有很多不完善的地方。 2018-01-09新增:后端的MQ事件结构现在也...

    yankeys 评论0 收藏0
  • Vue+websocket+stompjs 实时监控坐席状态demo

    摘要:之后坐席状态改变,可以看到有事件推送过来。关于的重连程序后服务端使用这里我直接引用我的另一个项目的部分代码,这个没有使用,直接使用浏览器原生的。重连的原理很简单,就是检测到断开时,去调用我的方法,这里我也做了重连的次数限制。 由于是前后端分离的demo, 程序的后端我不管,我只负责把前端做好,这只是个demo, 还有很多不完善的地方。 2018-01-09新增:后端的MQ事件结构现在也...

    EdwardUp 评论0 收藏0

发表评论

0条评论

I_Am

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<