来电黑名单 java 软件_Android8.1 源码修改之通过黑名单屏蔽系统短信功能和来电功能...

前言

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

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

屏蔽短信功能

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

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

源码位置 frameworksopttelephonysrcjavacomandroidinternaltelephonyBlockChecker.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()方法,电话和短信都会走这里,如果你需要单独分开,那么就需要去跟踪各自从哪里调用过来的。

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

vendormediatekproprietarypackagesservicesTelecommsrccomandroidservertelecomcallfiltering

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();

}

}

接下来再来看短信的

vendormediatekproprietaryframeworksopttelephonysrcjavacommediatekinternaltelephonycdmaMtkCdmaInboundSmsHandler.java

vendormediatekproprietaryframeworksopttelephonysrcjavacommediatekinternaltelephonygsmMtkGsmInboundSmsHandler.java

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

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

56d2a89144f238025c7adba307b53216.png

效果图

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

android:title="@string/security_settings_title">

android:persistent="false">

android:key="is_intercept"

android:title="@string/is_intercept"

android:summary="@string/is_intercept_summary"/>

在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;

}

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

参考文章

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值