前言

之前写过一篇Android6.0 的屏蔽系统短信功能和来电功能,具体看这里

同样的最近有个新需求,需要将8.1 设备的来电功能和短信功能都屏蔽掉,特殊产品就是特殊定制,那就开始吧。

屏蔽短信功能

还可沿用之前的6.0 处理方法, 在 SmsReceiverService.java 中 handleSmsReceived()中进行拦截分发

但是想了想这次准备搞点不一样的,我发现通讯录和之前6.0不太一样,8.1有个添加屏蔽联系人的功能,能够屏蔽指定电话和短信,也就是黑名单功能。所以此次就通过黑名单的方式进行拦截,通过下面几位老哥的详尽分析和打印日志找到修改地方

源码位置 frameworks\opt\telephony\src\java\com\android\internal\telephony\BlockChecker.java

public static boolean isBlocked(Context context, String phoneNumber) {
boolean isBlocked = false;
long startTimeNano = System.nanoTime();
//cczheng add [S]
log("phoneNumber==="+phoneNumber);
boolean isIntercept = Settings.Global.getInt(context.getContentResolver(),
Settings.Global.IS_INTERCEPT_TELE, 1) == 1;
if (isIntercept) {
log("Intercept tele don't delivery..... default is blocked");
return true;
}
//cczheng add [E]
try {
if (BlockedNumberContract.SystemContract.shouldSystemBlockNumber(
context, phoneNumber)) {
Rlog.d(TAG, phoneNumber + " is blocked.");
isBlocked = true;
}
} catch (Exception e) {
Rlog.e(TAG, "Exception checking for blocked number: " + e);
} int durationMillis = (int) ((System.nanoTime() - startTimeNano) / 1000000);
if (durationMillis > 500 || VDBG) {
Rlog.d(TAG, "Blocked number lookup took: " + durationMillis + " ms.");
}
return isBlocked;
}

代码很简单,传递一个号码,去BlockedNumberContract数据库中查找是否存在,存在即为黑名单,拦截,不存在则不拦截。

为了实现拦截的功能,我在前面加了判断,Settings.Global.IS_INTERCEPT_TELE 读取值,这是在Settings中自定义的,当然你也可以采用SharedPreference保存,这样就可以动态的控制达到屏蔽短信和电话的功能。

当然如果你需要有黑名单列表,可在此处增加xml或者数据库查询,再做对应的拦截返回true操作。

屏蔽来电功能

方法同上

相关的简单分析

BlockChecker的isBlocked()方法,电话和短信都会走这里,如果你需要单独分开,那么就需要去跟踪各自从哪里调用过来的。

通过全局搜索,找到如下目录

vendor\mediatek\proprietary\packages\services\Telecomm\src\com\android\server\telecom\callfiltering

  • AsyncBlockCheckFilter.java
  • BlockCheckerAdapter.java
  • CallFilteringResult.java
  • CallFilterResultCallback.java
  • CallScreeningServiceFilter.java
  • DirectToVoicemailCallFilter.java
  • IncomingCallFilter.java

AsyncBlockCheckFilter中调用 BlockCheckerAdapter 的isBlocked(),而BlockCheckerAdapter最终调用到BlockChecker中,所以要单独屏蔽电话,可在AsyncBlockCheckFilter中操作

 @Override
protected Boolean doInBackground(String... params) {
try {
Log.continueSession(mBackgroundTaskSubsession, "ABCF.dIB");
Log.addEvent(mIncomingCall, LogUtils.Events.BLOCK_CHECK_INITIATED);
return mBlockCheckerAdapter.isBlocked(mContext, params[0]);
} finally {
Log.endSession();
}
}

接下来再来看短信的

vendor\mediatek\proprietary\frameworks\opt\telephony\src\java\com\mediatek\internal\telephony\cdma\MtkCdmaInboundSmsHandler.java

vendor\mediatek\proprietary\frameworks\opt\telephony\src\java\com\mediatek\internal\telephony\gsm\MtkGsmInboundSmsHandler.java

都是直接调用BlockChecker的isBlocked()方法

在Settings中增加Switch控制是否启用拦截

效果图

实际上就是添加一个SwitchPreference来控制 Settings.Global.IS_INTERCEPT_TELE 的值

在安全性和位置信息中添加 拦截设置选项

源码位置 vendor/mediatek/proprietary/packages/apps/MtkSettings/src/com/android/settings/SecuritySettings.java

仿照security_settings_misc.xml增加一份 security_settings_blockcheck.xml

<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
android:title="@string/security_settings_title"> <PreferenceCategory android:title="@string/security_blockcheck_title"
android:persistent="false"> <SwitchPreference
android:key="is_intercept"
android:title="@string/is_intercept"
android:summary="@string/is_intercept_summary"/> </PreferenceCategory> </PreferenceScreen>

在SecuritySettings中findPreference("is_intercept"),监听onPreferenceChange()事件,将回调结果 value 保存到IS_INTERCEPT_TELE

@Override
public boolean onPreferenceChange(Preference preference, Object value) {
boolean result = true;
final String key = preference.getKey();
final LockPatternUtils lockPatternUtils = mChooseLockSettingsHelper.utils(); if (KEY_IS_INTERCEPT.equals(key)) {
Settings.Global.putInt(getContentResolver(), Settings.Global.IS_INTERCEPT_TELE,
((Boolean) value) ? 1 : 0);
}
return result;
}

好了,至此功能完成,感兴趣的可研读下列参考文章

参考文章

Android7.0 Phone应用源码分析(二) phone来电流程分析

Telephony之GsmCallTracker

Android 8.0来电流程分析(一)

Android8.1 源码修改之通过黑名单屏蔽系统短信功能和来电功能的更多相关文章

  1. Android8.1 源码修改之插入SIM卡默认启用Volte功能

    前言 公用电话产品,插入SIM卡后要求自动打开Volte功能,即插即用,用完拔卡就走 实现 第一步 开关对应的代码 通过打印日志和全局查找,源码位置 vendor/mediatek/proprieta ...

  2. Java学习-039-源码 jar 包的二次开发扩展实例(源码修改)

    最近在使用已有的一些 jar 包时,发现有些 jar 包中的一些方法无法满足自己的一些需求,例如返回固定的格式,字符串处理等等,因而需要对原有 jar 文件中对应的 class 文件进行二次开发扩展, ...

  3. python的paramiko源码修改了一下,写了个操作命令的日志审计 bug修改

    python的paramiko源码修改了一下,写了个操作命令的日志审计,但是记录的日志中也将backspace删除键记录成^H这个了,于是改了一下代码,用字符串的特性. 字符串具有列表的特性 > ...

  4. Android6.0 源码修改之 Contacts应用

    一.Contacts应用的主界面和联系人详情界面增加顶部菜单添加退出按钮 通过Hierarchy View 工具可以发现 主界面对应的类为 PeopleActivity 联系人详情界面对应的类为 Qu ...

  5. Android6.0 源码修改之 仿IOS添加全屏可拖拽浮窗返回按钮

    前言 之前写过屏蔽系统导航栏功能的文章,具体可看Android6.0 源码修改之屏蔽导航栏虚拟按键(Home和RecentAPP)/动态显示和隐藏NavigationBar 在某些特殊定制的版本中要求 ...

  6. Android6.0 源码修改之屏蔽系统短信功能和来电功能

    一.屏蔽系统短信功能 1.屏蔽所有短信 android 4.2 短信发送流程分析可参考这篇 戳这 源码位置 vendor\mediatek\proprietary\packages\apps\Mms\ ...

  7. el-upload源码修改跳坑

    之前给element-ui提了一个问题,结果没有鸟我,没办法,只能修改源码来满足需求了 (备注:element-ui2依然没有修改,为了迎合产品还是要改源码) 本文讨论的组件属性仅限于list-typ ...

  8. openfire源码修改后如何打包部署到linux服务器上

    原文:http://blog.csdn.net/jinzhencs/article/details/50457152 1.linux版本的3.10.3解压部署启动(过程略,参考我的另一篇博文http: ...

  9. python requests接收chunked编码问题-python源码修改

    python requests接收chunked编码问题-python源码修改 学习了:https://blog.csdn.net/wangzuxi/article/details/40377467

随机推荐

  1. Java中往zip压缩包追加文件

    有个需求,从某个接口下载的一个zip压缩包,往里面添加一个说明文件.搜索了一下,没有找到往zip直接添加文件的方法,最终解决方法是先解压.再压缩. 具体过程如下: 1.一个zip文件的压缩和解压工具类 ...

  2. 浅谈Mysql重置密码

    新手刚开始用MySQL的时候可能会很容易忘记登录密码,下面说一下如何重置和修改密码 第一种方法:直接在命令行窗口操作停止服务器mysql(这是重点:直接停止)打开CMD 在命令行窗口输入MySQL安装 ...

  3. 利用Fiddler对Jmeter的请求进行抓包

    前言 有时候,为了得到更详细的请求结果,我们可能需要使用Fiddler结合Jmeter来抓包分析,从而更好的辅助测试. 遇到的问题 这里以一个获取学生信息的接口为例进行说明. 当我在Jmeter里按接 ...

  4. springboot向elk写日志

    springboot里连接elk里的logstash,然后写指定index索引的日志,而之后使用kibana去查询和分析日志,使用elasticsearch去保存日志. 添加引用 implementa ...

  5. eCharts二三维地图总结

    文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/ 1.背景 最近多个项目中的登录页面陆续提出了不少地图需求,主要围绕地图的 ...

  6. SpringCloud之Feign:REST客户端

    在Spring Cloud集群中,各个角色的通信基于REST服务,在调用服务时,需要使用REST客户端,常用,除了使用Spring自带的RestTemplate,也可使用另一个REST客户端:Feig ...

  7. centos7设置静态ip-修改配置文件方式

    修改IP地址为静态地址需要修改配置文件,首先打开配置文件,在控制台输入cd /etc/sysconfig/network-scripts 输入ifconfig,这样就可以看到你的ip地址等信息了. v ...

  8. docker容器虚拟化技术

    简单来说,在Windows系统下安装各种运行环境的坑简直不要太多了(● ̄(エ) ̄●),并不仅限于docker.Nginx.PHP.Python等等,我会尽详细写出实际过程中遇到的各种各样的奇葩问题 1 ...

  9. [PHP]关于连接MySQL的问题

    概述 PHP中无论使用MySQL函数抑或PDO连接MySQL服务器,都允许有两种方式,一是通过TCP网络层,一是通过unix socket: PHP并没有给出指明用何种方式去连接数据库,决定使用何种方 ...

  10. 2019-2020-1 20199305《Linux内核原理与分析》第八周作业

    可执行程序的工作原理 (一)ELF目标文件 (1)什么是ELF? 这里先提一个常见的名词"目标文件",是指编译器生成的文件.ELF(Executable and Linkable ...