服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - Android - Android8.1 通过黑名单屏蔽系统短信和来电功能

Android8.1 通过黑名单屏蔽系统短信和来电功能

2022-10-17 13:45cczheng Android

最近小编接到一个新的需求,需要将8.1 设备的来电功能和短信功能都屏蔽掉,特殊产品就是特殊定制。接下来通过本文给大家介绍Android8.1 通过黑名单屏蔽系统短信和来电功能,需要的朋友参考下吧

前言

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

屏蔽短信功能

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

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

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
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中操作

?
1
2
3
4
5
6
7
8
9
10
@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控制是否启用拦截

Android8.1 通过黑名单屏蔽系统短信和来电功能

效果图

实际上就是添加一个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

?
1
2
3
4
5
6
7
8
9
<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

?
1
2
3
4
5
6
7
8
9
10
11
12
@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;
}

总结

以上所述是小编给大家介绍的Android8.1 通过黑名单屏蔽系统短信和来电功能,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对服务器之家网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

原文链接:https://www.cnblogs.com/cczheng-666/archive/2019/05/09/10840342.html

延伸 · 阅读

精彩推荐