Android开发电话/短信拦截如何实现呢?
最近有个客户需要拦截短信/电话,那这个功能怎么实现呢?
需求大概是这样子的,如果是联系人在通讯录里的,则可以拨打进来。
如果来电号码不在通讯录里的,则要拦截。
也就是白名单机制。
思考
- 拦截,什么地方拦截呢?
- 凭借什么拦截呢?这个好说,我们可以通过内容提供者从通讯录中查询出联系人是否存在,根据条件拦截即可。
- 如果哪天客户不开心了,说不用拦截了呢?所以我们要做一个开关,可以控制拦截,或者所有都不拦截。
拦截的话根据条件拦截。
如果要做得好一点的话,应该抽象出接口,具体的拦截条件由接口子类去实现。
什么地方拦截呢?
修改路径:
sources/frameworks/opt/telephony/src/java/com/android/internel/telephony/BlockChecker.java
以上,手动输入的,大概位置吧,如果错了的话。
因为我的电脑还在编译,我就懒得去输出路径了。
修改什么内容呢?
我这里是根据白名单来判断是否要拦截的。
所以我代码修改大概如下:
//以下中文注释by TrillGates=====================================================
public static boolean isBlocked(Context context, String phoneNumber, int blockType) {
Rlog.d(TAG,"phoneNumber is == > " + phoneNumber + " blockType ==> " + blockType);
//读取一个配置文件,判断是否需要拦截
String isBlockPhoneNum = getSystemProperties("persist.sys.isBlockPhone","false");
Log.d(TAG,"isBlockPhoneNum == > " + isBlockPhoneNum);
if("false".equals(isBlockPhoneNum)){
return false;
}
boolean isBlocked = false;
long startTimeNano = System.nanoTime();
boolean isCallBlock;
boolean isSmsBlock;
//创建TelephonyManagerEx,这个是展讯的
//TelephonyManagerEx tmEx = TelephonyManagerEx.from(context);
//直接判断是否在通讯录里的,如果在通讯录里,那么就不拦截
//如果不在通讯录里则会拦截,具体的修改会在BlockedNumberContract.SystemContract.shouldSystemBlockNumber里
//来电拦截
if (blockType == sCallBlockType) {
//if (tmEx != null && tmEx.isCallFireWallInstalled()) {
// isCallBlock = tmEx.checkIsBlockCallNumber(context, phoneNumber);
//} else {
isCallBlock = true;
//}
try {
if (BlockedNumberContract.SystemContract.shouldSystemBlockNumber(
context, phoneNumber) && isCallBlock) {
Rlog.d(TAG, phoneNumber + " is blocked.");
isBlocked = true;
} else {
isBlocked = false;
}
} catch (Exception e) {
Rlog.e(TAG, "Exception checking for blocked number: " + e);
}
}
//短信拦截
if (blockType == sSmsBlockType) {
// if (tmEx != null && tmEx.isCallFireWallInstalled()) {
// isSmsBlock = tmEx.checkIsBlockSMSNumber(context, phoneNumber);
// } else {
isSmsBlock = true;
// }
try {
if (BlockedNumberContract.SystemContract.shouldSystemBlockNumber(
context, phoneNumber) && isSmsBlock) {
Rlog.d(TAG, phoneNumber + " is blocked.");
isBlocked = true;
} else {
isBlocked = false;
}
} 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;
}
//==================================================================================
可以看到,短信和电话的拦截都在这里了。
如果控制是否拦截呢?
从前面的代码,可以看到,我通过这样一个配置来判断是否拦截。
String isBlockPhoneNum = getSystemProperties("persist.sys.isBlockPhone","false");
Log.d(TAG,"isBlockPhoneNum == > " + isBlockPhoneNum);
if("false".equals(isBlockPhoneNum)){
return false;
}
拦截条件查询
这里则是查询啦
try {
if (BlockedNumberContract.SystemContract.shouldSystemBlockNumber(
context, phoneNumber) && isCallBlock) {
Rlog.d(TAG, phoneNumber + " is blocked.");
isBlocked = true;
} else {
isBlocked = false;
}
} catch (Exception e) {
Rlog.e(TAG, "Exception checking for blocked number: " + e);
}
具体的查询方式同学们可以看这里
看这篇文章同学们就知道怎么查询了。
具体的情况还是具体分析,同学们根据自己的需求去拦截就好。