
通过短信黑名单阻止系统短信和呼叫者功能前言修改Android8.1源代码的序言
我之前写过一篇有关Android 6.0的阻止系统短信功能和来电功能的文章cc短信拦截,有关详细信息,请参见此处
类似地,最近有新的需求. 您需要阻止8.1设备的来电功能和短信功能. 特殊产品是特殊的定制,所以让我们开始吧.
阻止短信功能
您还可以使用以前的6.0处理方法,并在SmsReceiverService.java的handleSmsReceived()中进行拦截和分发
但是这次考虑准备一些不同的东西后,我发现与以前的6.0、8.1不同,它具有阻止联系人的功能,该功能可以阻止指定的呼叫和短信,这是黑名单功能. . 因此,这一次,我们将使用黑名单进行拦截,并通过详细分析和打印后续兄弟的日志来找到修改位置.
源位置框架\ opt \电话\ src \ java \ com \ android \内部\电话\ 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()方法. 电话和短信都将在此处. 如果需要将它们分开,则需要跟踪从何处调用它们.
通过全局搜索找到以下目录

供应商\ Mediatek \专有\包\服务\ Telecomm \ src \ com \ android \服务器\电信\呼叫过滤
AsyncBlockCheckFilter.javaBlockCheckerAdapter.javaCallFilteringResult.javaCallFilterResultCallback.javaCallScreeningServiceFilter.javaDirectToVoicemailCallFilter.javaIncomingCallFilter.java
在AsyncBlockCheckFilter中调用BlockCheckerAdapter的isBlocked(),最后在BlockChecker中调用BlockCheckerAdapter,因此要单独阻止电话cc短信拦截,可以在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();
}
}
让我们再看一次短信
供应商\ mediatek \专有\框架\ opt \电话\ src \ java \ com \ mediatek \内部\电话\ cdma \ MtkCdmaInboundSmsHandler.java
供应商\ mediatek \专有\框架\ opt \ telephony \ src \ java \ com \ mediatek \内部\ telephony \ gsm \ MtkGsmInboundSmsHandler.java
直接调用BlockChecker的isBlocked()方法

添加“切换到设置”以控制是否启用拦截

效果图
它实际上是添加一个SwitchPreference来控制Settings.Global.IS_INTERCEPT_TELE的值
在安全性和位置信息中添加阻止设置选项
源位置供应商/ mediatek /专有/软件包/应用程序/ MtkSettings / src / com / android / settings / SecuritySettings.java
在security_settings_misc.xml之后添加security_settings_blockcheck.xml的副本

在SecuritySettings中
FindPreference(“ is_intercept”),侦听onPreferenceChange()事件,并将回调结果值保存到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应用程序源代码分析(二)电话通话过程分析
电话֮GsmCallTracker
Android 8.0呼叫流分析(1)
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/tongxinshuyu/article-148576-1.html
谁去北京
我们就可以进行实际演练
那文笔谁看啊