作者 Zhonglong.chen
黑名单作为一项非常重要的功能,一直以来Android原生都没有提供支持,因此各芯片厂商都有自己的实现方案。本文总结了MTK平台芯片在Android 4.4,Android 5.x和Android 6.0这三个版本上黑名单功能的实现方式。
MTK平台上以Content Provider的形式提供黑名单数据库的接口,但在三个版本上实现略有差异。
1. Android4.4
l Number:电话号码
l Type:枚举型,取值为BLOCK_VOICE_CALL,BLOCK_VIDEO_CALL和BLOCK_VOICE_AND_VIDEO_CALL三种,可见视频电话与普通电话黑名单是可以分开管理的
2. Android5.x
l Number:电话号码
Android 5.x引入了MPlugin架构,将黑名单数据库放到OPxxPlugin中实现,与Android 4.4相比黑名单数据库变化不大,只是移除Type字段,不再区分视频电话和普通电话。
3. Android6.0
l PHONE_NUMBER:电话号码
l NAME:联系人姓名,可为空
Android 6.0将黑名单功能从OPxxPlugin中独立出来,放到单独的Blacklist模块中实现,并且数据库变化也非常大。
表1 MTK平台上三个版本黑名单对比
|
Android 4.4 |
Android 5.x |
Android 6.0 |
CONTENT_URI |
content://reject/list |
content://reject/list |
content://com.cmcc.ccs.black_list |
表结构 |
Number Type |
Number |
PHONE_NUMBER NAME |
访问权限 |
READ_REJECT & WRITE_REJECT |
READ_REJECT & WRITE_REJECT |
无 |
实现类 |
未知 |
OP01Plugin.apk com.mediatek.phone.callrejection.CallRejectContentProvider |
Blacklist.apk com.mediatek.rcs.blacklist.BlacklistProvider |
代表芯片 |
MT6582 |
MT6753 |
MT6755 |
4. 查询黑名单
黑名单数据库中存储的是原始的电话号码,并未进行格式化,因此不能直接通过query方式查询某个号码是否黑名单,而必须读出黑名单中的所有电话号码,再通过PhoneNumberUtils.compare方法逐个进行模糊匹配。
publicboolean aut