--- 作者 zuhui.zhang
安卓7.0原生系统增加了在framework层拦截黑名单来电和短信,但不会将数据保存到数据库,因此无法查看到被拦截的来电和短信。在安卓7.0之前,黑名单的短信默认是不会拦截的,为了实现黑名单短信拦截功能,需要对短信数据库表中的字段新增特殊的值,以便标记黑名单短信。以下具体说明下笔者对于MTK方案里的短信应用中拦截短彩信的实现方法。
一、拦截黑名单短信
涉及到的类:
com.android.mms.transaction.SmsReceiverService:短信接收服务类,
MyBlacklistManager:新创建的类,用于判断号码是否在黑名单、添加号码到黑名单、移除号码。
a) 实现思想:
在SmsReceiverService. handleSmsReceived()中,判断新来短信的号码是否是在黑名单中,如果是,则将Sms.READ设为1,同时将Sms.TYPE设为MyBlacklistManager. MESSAGE_TYPE_INTERCEPTED=7,然后保存到短信收件箱。要查看拦截短信时,只要查询数据库过滤出Sms.TYPE=7的短信,则为被拦截的黑名单短信。
b) 具体实现方法:
插入拦截字段:在SmsReceiverService .handleSmsReceived()中,在insertMessage()->storeMessage()函数中判断是否是黑名单,若是,则在sms表的type字段插入拦截类型的值(MESSAGE_TYPE_INTERCEPTED),read字段设为1:防止在launcher上显示未读短信数量,并MyBlacklistManager类使用一个布尔型变量记录已经成功拦截短信。
只通知被拦截的短信:在handleSmsReceived中,在insertMessage()调用之后,通过调用MyBlacklistManager中的autoReject()判断号码是否在黑名单列表中,如果是则只发出通知(隐藏部分信息),但是不会亮屏、发出通知音和振动。
其中autoReject()方法和方法中用到的变量如下:
// blacklist table uri
// private static final Uri BLACK_LIST_URI =Uri.parse("content://reject/list");// for android 4.4 to 5.x
private static final Uri BLACK_LIST_URI = Uri.parse("content://com.cmcc.ccs.black_list");// for android 6.0
// table field name
private static final String REJECT_FIELD_NUMBER="PHONE_NUMBER";
/**
* check if the number should be rejected
* @param number the sms/mms recipient
* @param type reject type, inBlackListManager class had define
* @return the result that the currentnumber should be auto reject, true:in blacklist, or not in.
*/
public static boolean</