相信很多Android手机用户都用过手机安全软件的“电话拦截”功能,不管您用的是360安全卫士、腾讯手机管家,还是金山毒霸…,它们的共同特点就是您在设置来电拦截黑名单或开启/关闭来电等待时,界面并不友好(如下图所示),比如:会有拨号界面弹出再消失,或者手机会拨打一个号码,需要用户手动挂断或直到连接自动挂断。

第三方应用(即使具有root权限)在完成这两个功能时,无法避免拨号界面的出现。原因是这两个功能需要利用SIM卡呼叫转移、呼叫等待功能,拨打某个特定号码,所以设置该功能时会出现拨号界面。

以GSM为例,现在的实现中:

来电拦截返回音是通过拨以下特定号码实现的:

String BUSY_NUMBER = "%23%2367%23";

String EMPTY_NUMBER = "**67*13800000000%23";

String POWEROFF_NUMBER = "**67*13810538911%23";

String OUT_OF_SERVICE_NUMBER = "**67*13701110216%23";

呼叫等待开启和关闭是通过拨以下号码实现的:

String GSM_CALL_WAIT_OPEN = "*43%23";

String GSM_CALL_WAIT_CLOSE = "%2343%23";

所以通过一个第三方应用(即使它有root权限)去设置来电拦截返回音或开启/关闭呼叫等待时,就会出现拨号界面,用户体验不好。

一、原理分析

1、Android去电流程

下图右边蓝色框中粗略的给出了Android拨打电话的流程,其中蓝色填充的部分表示的App层phone应用,粉色填充部分表示的是framework层。从图中可看出,当拨出电话流程走到CallController的placeCall()后,会做两件事情:1),call CallManager的dial()方法拨打电话;2),不管拨打成功与否,都会将InCallScreen(拨号界面)展示到前端。当通过第三方应用设置来电拦截返回音时,根据来电拦截原理,会拨打某个特殊的号码,因此通过正常的Outgoing call流程一定不可避免拨打界面的出现。

二、改进和优化

我们从系统入手,彻底解决这个不友好的界面。完整的拨号流程会从app层->framework层,拨号界面的出现是在app层,因此我们避开拨号流程中app层的流程,通过我们自己的service直接调用framework层的拨号方法,从而避免了拨号界面的出现,消除了不好的用户体验。

i) 在init.rc中添加一个service(上图左边Service绿色方框所示),并授予它root权限。该service起来之后,等待client端的请求。并对client端暴露了一套SDK API接口(上图左边SDK API绿色方框所示),app应用通过调用这套API接口,设置、查询来电拦截返回音。我们提供的SDK 接口有:

public boolean setReturnCause(int reason, int simId);//设置来电拦截返回音

public String getCallForwardSetting(int reason, int simId);//查询呼叫转移号码(即返回音)

public boolean setCallWait(int status, int simId);//设置开启/关闭呼叫等待

ii) 在PhoneInterfaceManager中新增一个方法setReturnCause()(如上图左边绿色部分所示),当用户设置来电拦截返回音或呼叫等待时,返回音类型或呼叫等待待设类型会传递给telephony service,并通过PhoneInterfaceManager中的方法setReturnCause()(来电拦截和呼叫等待原理相同,因此走的同一套流程)去直接调用framework层的dial()方法,从而避免弹出InCallScreen。

从以上的分析可看出,针对设置来电返回音和开启/关闭呼叫等待功能会弹出拨号界面这一问题,第三方应用,不管它有没有root权限,都无法避免拨号界面的出现。而我们从系统入手,将拨号流程“拦腰”截断,从底层“静默”进行拨号流程,避免了上层的拨号界面的弹出。

三、存在问题

1、由于在“通话设置”->“来电转接”->“占线时转接”中可查询并修改返回音的状态,因此,对返回音设置途径并不唯一。用户可手动进入通话设置中设置,也可通过其他手机安全软件设置,又或者通过我们提供的API设置。这会就造成来电拦截返回音以最后一次设置为准(不管是通过哪种途径设置)。

2、正常拒接电话操作(比如有电话打入,此时用户直接挂断电话),android系统中默认的是用户忙(所以您打电话出去,接收者挂断您的电话,您会听到“您拨打的用户忙”)。而由于忙时转接已被设置,所以正常的来电被挂断就会走忙时转接流程,因此返回音也会相应的改成用户已经设置的返回音了。所以也许有的用户有过这样的经历:您拨打电话给某人,电话通了之后,返回“您拨打的用户已停机”等,可能是由于他设置了来电拦截黑名单时选择的返回音是“已关机”,从而修改了忙时转接的号码。

设置电话拦截返回音浅析相关推荐

  1. 小米手机拦截返回音设置不了_要怎样设置才让对方打电话进来是空号?

    最简单设置为空号的方法是通过手机管家软件,在[骚扰拦截]中添加电话黑名单,找到[来电拦截返回音]设置为空号,也可以讲电话呼叫转移或者设置为空号等方式.以下是详细介绍: 1.如果您只是针对特定的号码而不 ...

  2. 小米手机拦截返回音设置不了_MIUI 12第二批稳定版已完成全量推送:你的手机支持吗...

    9月8日消息,MIUI官微宣布,MIUI 12第二批稳定版已完成全量推送! 01 合计14款机型支持 第二批支持机型共14款:小米8.小米8屏下指纹版.小米8透明探索版.小米MIX3.小米MIX2S. ...

  3. 小米手机拦截返回音设置不了_烦人的骚扰电话该怎么有效拦截?其实很简单,以小米手机为例...

    相信很多人都在日常生活中受到骚扰电话的困扰,从周一到周日,这些骚扰电话从未停止. 周一刚上班,正在开会,来了一个,还么开完,又来了一个. 周末,你还在睡觉,被骚扰电话吵醒. 有一天,你有时间了,想接一 ...

  4. 小米手机拦截返回音设置不了_为了让自己的手机更好用,我利用了MIUI 10的这些功能...

    想要了解更多热门资讯.玩机技巧.数码评测.科普深扒,可以点击右上角关注我们的头条号:雷科技 ---------------------------------- 2018年5月31日小米8发布会上,小 ...

  5. 小米手机拦截返回音设置不了_为了让自己的手机更好用,我利用了 MIUI 10 的这些功能...

    2018 年 5 月 31 日小米 8 发布会上,小米手机的御用系统 MIUI 10 发布,随后开始向各款小米手机提供更新. 这个"AI 加持的全面屏系统"发布至今已经半年,小雷( ...

  6. 小米手机拦截返回音设置不了_小米手机用户注意了!这几个超好用的功能你没用过就太可惜了...

    欢迎转载,请注明出处,抄袭必究! 作为国内互联网手机的"元老",小米手机从诞生伊始似乎就自带玩机属性,在早期崛起的道路上,除了性价比,有趣好玩的功能和技巧也是一大重要因素. 不过对 ...

  7. 小米手机拦截返回音设置不了_MIUI 12,是国产手机最强OS吗?

    郭德纲的相声里,曾经说过这么一句话 "文无第一,武无第二" .谁的文章写得好.谁的画画得好,很难分出高低,因为每个人的标准不一样,你喜欢的就是最好的:但是谁跑得快.跳得高,用计时器 ...

  8. 小米手机拦截返回音设置不了_小米手机的隐藏小技巧!超级黑科技,你用过几个...

    我们都知道,小米手机现在发展的很快,而且也越来越受到大家的喜欢,小编身边的米粉可不在少数,尤其是小米手机上面的一些隐藏小技巧,真的是太好用,难怪会受到一众米粉的追捧!今天小编就来带大家看看小米这些隐藏 ...

  9. 小米手机拦截返回音设置不了_小米手机怎么录屏?没想到这么好用,后悔知道晚了。...

    大家平常使用小米手机有录屏的习惯吗?肯定有不少小伙伴从来没有用小米手机录屏过,一来是不知道录屏功能在哪里,二来也不知道录屏功能该怎么使用.应粉丝要求,今天就来给大家讲讲小米手机录屏的正确方法. [具体 ...

最新文章

  1. java domain层_java框架中的controller层、dao层、domain层、service层、view层
  2. PyQt5教程7:布局Layout管理
  3. 实验楼 “python3简明教程” 挑战三:玩转函数
  4. 点个外卖搞定「软中断」
  5. 怎么看电脑的hdmi是输出还是输入_高清hdmi矩阵切换器4进4出音视频方案介绍景阳华泰科技...
  6. C#学习基础---BrowsableAttribute.Browsable属性
  7. VMware运维工程师常用工具介绍
  8. 服务器上的文件误删怎么恢复,云服务器误删文件恢复
  9. php生成临时文件,php生成zip压缩文件的方法详解
  10. 【AE】2 ICommand和ITool
  11. 什么是五险一金,你懂吗?
  12. Mac小技巧|怎么移动Mac状态栏的图标
  13. 使用Echarts将Excel数据转换成色彩地图HTML小工具
  14. linux 重启nginx命令
  15. 2019上交CS考研经验贴
  16. C++运算符重载函数
  17. Gitee码云remote: error: File: , exceeds 100.00 MB 踩坑指南
  18. 云聚华为伙伴暨开发者大会GaussDB专场
  19. 徘徊在神与兽间的人们
  20. JavaScript写横向二级导航

热门文章

  1. MATLAB 复杂网络聚类系数代码
  2. 今天,「神舟十二号」发射!这次载人航天有什么不一样?
  3. 4分钟对拉300多次,谷歌用AI研发「乒乓球机器人」
  4. Python实现极限学习机ELM【hpelm库】(内涵源代码)
  5. lol3.17服务器维护,LOL3月17日更新维护时间 英雄联盟3月17日停机维护内容介绍_蚕豆网新闻...
  6. 全解析jQuery插件开发!很好很强大!
  7. python3[爬虫实战] 使用selenium,xpath爬取京东手机(下)
  8. 【WINDOWS / DOS 批处理】if命令参数详解(一)
  9. 20.5文件操作-格式化读写
  10. C++Test软件下载安装使用试用