前言

之前写过一篇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来电流程分析(一)

最新文章

  1. [个人翻译]Redis 集群教程(上)
  2. import com.sun.image.codec.jpeg.JPEGCodec不通过 找不到包
  3. 基于百度定位及天气获取的DEMO +fragment+sharedpreference
  4. SIP 状态码
  5. 深入学习Struts2
  6. delete了,析构函数却没有调用
  7. js获取本地ip和地区
  8. 加解密、PKI与CA基础
  9. .net 解压缩 rar文件
  10. maven新建项目
  11. 带你了解zabbix如何监控mysql主从到报警触发
  12. Git进阶用法
  13. React项目新手指南
  14. 知识点:Mysql 基本用法之函数
  15. python3:实现字符串的全排列(无重复字符)
  16. #12【BZOJ3003】LED BFS+状压DP
  17. 网页中创建音频、视频和Flash等多媒体:object元素
  18. python 判断 txt 编码方式
  19. js+jquery
  20. VS Code - Debugger for Chrome调试js

热门文章

  1. 精通awk系列(14):细说awk中的变量和变量赋值
  2. C# -- 模拟扑克牌发牌
  3. JS---体验DOM操作
  4. Vue初始化过程
  5. Nginx 入门学习
  6. Dijkstra.NET 库体验报告
  7. tp、tftp、nfs--服务器搭建
  8. 如何从 ASH 找到消耗 PGA 和 临时表空间 较多的 Top SQL_ID (Doc ID 2610646.1)
  9. Struts2.0
  10. s3c2440裸机-内存控制器(三、norflash初始化-时序设置)