Day07 2016-7-26 电话短信拦截功能
短信拦截:
初始想法:接收短信会收到一个有序广播,自定义一个广播接收器,将优先级调高,判断如果是需要拦截的短信就截断广播。
官方文档说优先级最高是1000。静态注册广播发现系统的短信会先收到广播,无法实现想要的功能。
动态注册的优先级比静态注册高,但是如果软件不能开机自启或者被关掉,那么也无法实现拦截。
静态注册让优先级是2147483647,发现无法进入onReceive()函数。我又试了2147483646,这次倒是可以了,但是系统短信先收到的。
尝试了一下动态注册,设置优先级是2147483647,可以进入onReceive函数,但是还是系统短信先收到的。
网上搜到的方法基本都跟我的初始想法一致,经试验该方法已经不可行了。不过我又发现了有人说可以监听短信数据库,采用观察者模式。但是我觉得用这种方式虽然能删掉短信,但用户还是会收到提醒,并不是一个好的方法。
android4.4之后,新增了一个default sms的机制,简而言之,就是如果要在4.4之后实现短信拦截功能,就必须成为default sms,把所有短信相关的功能都包揽了,然后再做短信拦截。但这种做法,适配性和兼容性的工作是非常巨大的,短信、wapush(多种)、彩信、单双卡等等,相当于要求短信拦截类的软件要集成一个功能非常完善的通讯录类应用的功能。
可以利用4.2+后的添加App Ops权限管理功能,在MESSAGE的TAB中找到自己的App,并进入相应的权限管理界面,但是不是所有的手机都支持这个功能。原文在这:http://blog.csdn.net/l173864930/article/details/17112227
随后我又查到有人说 android4.4以上新增了个android.app.AppOpsManager,通过反射它来显示短信拦截或删除。可参考:http://bbs.gfan.com/android-7501638-1-1.html
其它链接:
初始想法讲解:http://blog.csdn.net/etzmico/article/details/7317892
参照知乎上这个问题可以了解动态注册优先级高的原因:http://www.zhihu.com/question/37356401
保持APP不被kill可以参照知乎上这个问题:http://www.zhihu.com/question/29826231
监听短信数据库可以参照:
http://www.jb51.net/article/64846.htm
http://blog.csdn.net/junjieking/article/details/6758626
http://www.cnblogs.com/baiqiantao/p/5549261.html
电话拦截
挂断一个电话在API-10和之前版本中直接调用TelephonyManager对象的endCall方法即可,但是之后的版本中这个API不再被公开(升级后的Android系统中还存在, 但是在Android SDK中不再提供给开发者* ),需要使用反射的方法。
可参照:
http://blog.csdn.net/shang1jk/article/details/11389809
http://www.linuxidc.com/Linux/2011-11/46416.htm
http://www.cnblogs.com/keshuangjie/archive/2012/08/31/2665298.html
android studio导入aidl出现问题,解决方案参照:http://blog.csdn.net/liyue199512/article/details/52033046
发现一个现象,手机收到来电(对方未挂断,自己未接听),这种情况下会收到两次广播,都是android.intent.action.PHONE_STATE。
我找到了一个同样的发现者:http://www.eoeandroid.com/thread-914869-1-1.html?_dsign=2e6a6d1c
依旧没找到原因,希望未来能掌握更多的知识和方法去探究真相
除了拦截以外,我在监听中开启了服务,在服务中弹出通知。
通知的使用可参见:http://blog.csdn.net/vipzjyno1/article/details/25248021/