去年做过一个项目,是要在windows mobile手机上做个来电防火墙, 其实原理很简单, 无非是截获来电并检查黑白名单, 按照规则给出相应的提示音, 现在总结一下, 大概有几个方面是关键点:
1. 如何截获来电?
有几种办法, 一种是底层的RIL函数, 这种方法响应迅速, 不会在拦截电话前还在屏幕上快速闪现一下来电提示窗口,或者是铃声突然响一下再消失. 缺点时RIL函数编程并不容易,如何处理好诸多RIL通知事件,并根据业务逻辑设计良好的程序逻辑是一个不小的挑战;
第二种办法是使用.net compact framework的notification, 包括:SystemProperty.PhoneCallCalling, SystemProperty.PhoneIncomingCall, SystemProperty.PhoneCallTalking.
SystemProperty.PhoneCallCalling: 表示正在呼出中...
SystemProperty.PhoneIncomingCall: 表示现在有电话来到...
SystemProperty.PhoneCallTalking: 表示通话是否建立or挂断?
通过这三个函数的取值组合, 能得到目前电话状态, 是正在拨出?还是有来电?还是电话已接通?还是电话已挂断?
由于我的项目要同时完成多种任务: 来电时要判断是否拦截; 要记录来电号码,来电时间; 通话时要记录通话时长;等等,所以用这种方法单独写一个程序来管理电话功能,效果比较好.
2. 如何定义规则?
就是拦截规则, 这个一般可以照着别人做好的防火墙软件, 无非是黑白名单, 全部拦截还是部分拦截, 还有分时段拦截等等...
3. 保存拦截记录.
拦截的电话需要记住,包括来电号码, 姓名, 时间. 保存在数据库或文件中.
4. 拦截后自动回复短信.
一般都要给出几条默认的短信, 并且允许用户自定义短信内容. 作为拦截电话后对方的回复, 比如"现在正在开会,稍后回复您"等等.
5. 最考验一个防火墙软件优劣的东西---提示音
你肯定不希望一个你不喜欢的人打你的电话时, 还让他在听筒里听到"嘟..."的一声,然后再告诉他"您拨打的电话已关机"吧??
这篇文章要给大家贡献的最有用的东西也就在这里:
直接告诉对方--“电话已关机”,“此号码已停机”,“号码不存在”, 而不再有任何提示音, 要达到这个目的, 必须用来电转移效果才最好, 因为来电转移是在源头处就把提示音直接播放给呼叫方, 其他任何方法都没有这个方法直接且效果好.
具体实现方法麻烦点,需要在程序里调用 AT指令,这里不详述了,有兴趣的可以去找(也许还有别的办法). 看到这里,你可能已经想到了, 要把来电转移到哪个号码上才能实现--“电话已关机”,“此号码已停机”,“号码不存在”三种提示音呢?
经过研究, 发现有些软件使用的是这三个号码:“13911950261”, “0 13555555555”, “1351234567”, 不信大家可以用电话打打这三个号码看看. “1351234567”, 很显然, 号码长度不足11位, 当然提示你“号码不存在”了, 呵呵.