`
android_squad
  • 浏览: 17466 次
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

设置电话拦截返回音浅析

阅读更多

相信很多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权限)去设置来电拦截返回音或开启/关闭呼叫等待时,就会出现拨号界面,用户体验不好。

 

一、原理分析

1Android去电流程

下图右边蓝色框中粗略的给出了Android拨打电话的流程,其中蓝色填充的部分表示的Appphone应用,粉色填充部分表示的是framework层。从图中可看出,当拨出电话流程走到CallControllerplaceCall()后,会做两件事情:1)call CallManagerdial()方法拨打电话;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系统中默认的是用户忙(所以您打电话出去,接收者挂断您的电话,您会听到“您拨打的用户忙”)。而由于忙时转接已被设置,所以正常的来电被挂断就会走忙时转接流程,因此返回音也会相应的改成用户已经设置的返回音了。所以也许有的用户有过这样的经历:您拨打电话给某人,电话通了之后,返回“您拨打的用户已停机”等,可能是由于他设置了来电拦截黑名单时选择的返回音是“已关机”,从而修改了忙时转接的号码。

 

 

  • 大小: 25 KB
  • 大小: 40.8 KB
分享到:
评论

相关推荐

    Android 来电拦截及拦截后的提示音源码-IT计算机-毕业设计.zip

    本项目“Android来电拦截及拦截后的提示音源码”是一个毕业设计示例,旨在帮助学生理解如何在Android应用程序中处理电话事件,并自定义拦截后的行为。 首先,我们要了解Android的电话服务。TelephonyManager是...

    Android代码-来电拦截及拦截后的提示音源码.zip

    总的来说,来电拦截和拦截后的提示音涉及到Android的核心组件和服务,包括权限管理、电话API、音频播放等。理解并熟练掌握这些知识,可以帮助开发者创建出功能强大的通信管理应用。通过分析提供的源码,可以进一步...

    来电拦截及拦截后的提示音

    电话拦截这个功能大家可能都知道了,就是利用反射原理调用ITelephony的隐藏方法来实现。这个就不说了,在附件的代码里有。 2.拦截后提示忙音/空号/已关机/已停机这个功能其实是要用到MMI指令,具体如何设置呼叫转移...

    Android程序研发源码Android 来电拦截及拦截后的提示音源码.zip

    4. 设置为系统提示音:若要将自定义提示音设置为来电提示音,需要请求WRITE_SETTINGS权限,并使用RingtoneManager类。 ```java Uri uri = Uri.parse("android.resource://" + getPackageName() + "/" + R.raw....

    电话来电拦截显示

    电话来电拦截显示是一种Android应用程序开发技术,主要用于提升用户在接听电话时的体验。它通过监听系统的电话广播事件,实现来电信息的实时捕获,并在屏幕上以悬浮窗口的形式展示来电号码,方便用户在不中断当前...

    ios-将系统返回手势拦截到自定义手势上(全屏返回).zip

    本教程聚焦于如何将系统内置的导航控制器(NavController)的返回手势拦截并映射到自定义的手势识别器(GestureRecognizer),特别是全屏返回手势。这一技巧可以让你自定义返回操作,增强应用的交互性与一致性。 ...

    Android 来电拦截及拦截后的提示音源码.zip

    在Android平台上,来电拦截是一种常见的功能,主要用于定制化手机体验,比如防止骚扰电话或在特殊情况下自动处理来电。本文将详细解析如何实现Android来电拦截以及拦截后播放自定义提示音的源码技术。 首先,来电...

    Android源码——来电拦截及拦截后的提示音源码.zip

    在实际开发中,来电拦截功能可能需要考虑用户体验,比如提供设置选项让用户选择是否开启拦截,以及自定义提示音等。同时,为了遵守平台政策,必须清楚地告知用户并获得其同意才能拦截来电。 综上所述,这份源码...

    swift-系统返回按钮事件拦截Swift版本

    本文将深入探讨如何在Swift中实现系统返回按钮事件的拦截。 首先,我们需要理解的是,iOS中的导航控制器(UINavigationController)默认提供了左侧的返回按钮,这个按钮的行为通常是返回上一级视图控制器。在Swift...

    Android 来电拦截及拦截后的提示音源码.rar

    在Android系统中,来电拦截和自定义提示音是两个与电话功能密切相关的技术。通过学习这个"Android 来电拦截及拦截后的提示音源码",我们可以深入理解Android的电话管理机制以及音频处理流程。 首先,来电拦截在...

    Android来电拦截及拦截后的提示音

    4. **设置提示音**:拦截来电后,为了告知用户,我们可以播放自定义的提示音。这通常需要使用`MediaPlayer`类来加载和播放音频文件。确保音频文件在`res/raw`目录下,并在适当的时候调用`MediaPlayer.start()`。 5....

    Android 实现来电拦截

    首先,要实现来电拦截,我们需要了解Android的电话服务API。Android提供了`com.android.internal.telephony`包,其中包含与电话相关的类,如`ITelephony`接口。然而,由于它是内部包,直接使用会面临权限问题。通常...

    通知栏和来电拦截

    2. **来电拦截**: 来电拦截功能是为了帮助用户管理不希望接听或者骚扰电话。当特定的号码被添加到拦截列表后,来自这些号码的来电将被自动阻止,不会显示在屏幕上,也不会有铃声或振动提示。有些系统还会提供智能...

    axios全局请求参数设置,请求及返回拦截器的方法.docx

    Axios 全局请求参数设置、请求及返回拦截器的方法 Axios 是一个流行的 JavaScript 库,用于发送 HTTP 请求。它提供了许多有用的功能,例如拦截器、取消请求、JSON 数据自动转换等。在实际开发中,我们经常需要对 ...

    Android 来电拦截及拦截后的提示音源码.zip源码资源下载

    在Android平台上,来电拦截功能是通过使用电话管理器(TelephonyManager)服务和注册广播接收器(BroadcastReceiver)来实现的。源码资源"Android 来电拦截及拦截后的提示音源码.zip"可能包含以下关键组件和技术: ...

    javascript实现fetch请求返回的统一拦截

    本篇文章主要探讨如何使用JavaScript实现fetch请求返回的统一拦截。 首先,我们需要理解拦截器的目的。拦截器主要用于在请求发送前或响应接收后执行一些通用操作,例如添加身份验证令牌、处理网络错误等。在axios库...

Global site tag (gtag.js) - Google Analytics