众所周知Android在4.4上增长了很多安全措施,除了把SELinux设置为enforce外,在短信方向也增强了限制。php
4.4以后,新增了一个default sms的机制,详细的描述,能够参考个人另外一篇文章《谈谈4.4中的新增功能对安全类软件的影响》。简而言之,就是若是要在4.4以后实现短信拦截功能,就必须成为default sms,把全部短信相关的功能都包揽了,而后再作短信拦截。但这种作法,适配性和兼容性的工做是很是巨大的,短信、wapush(多种)、彩信、单双卡等等,至关于要求短信拦截类的软件要集成一个功能很是完善的通信录类应用的功能。html
那么,是否有一种方法,能够在不成为default sms的同时也能够对短信进行“写操做”(这但是让4.4一会儿回到解放前啊。。。。)? 答案是有的。java
XDA大牛有人发现了一种比较讨巧的方法,原文能够参考这里。android
原理很简单,主要是利用4.2+后的添加的App Ops权限管理功能,在MESSAGE的TAB中找到本身的App,并进入相应的权限管理界面,以下图所示,FinalDemo是我本身测试的一个DEMO:数据库
留意到Write SMS/MMS的开头,默认是OFF的,但咱们能够把它打开。安全
打开以后,咱们就能够经过监控短信数据库变化的方法实现短信拦截了,我也写了个简单的测试代码,测试成功,把代码和相关的配置也放了来吧app
1 mObserver = new ContentObserver(new Handler()) { 2 3 @Override 4 public void onChange(boolean selfChange) { 5 super.onChange(selfChange); 6 ContentResolver resolver = getContentResolver(); 7 Cursor cursor = resolver.query(Uri.parse("content://sms/inbox"), new String[] { "_id", "address", "body" }, null, null, "_id desc"); 8 long id = -1; 9 10 if (cursor.getCount() > 0 && cursor.moveToFirst()) { 11 id = cursor.getLong(0); 12 String address = cursor.getString(1); 13 String body = cursor.getString(2); 14 15 Toast.makeText(SmsService.this, String.format("address: %s\n body: %s", address, body), Toast.LENGTH_SHORT).show(); 16 } 17 cursor.close(); 18 19 if (id != -1) { 20 int count = resolver.delete(Sms.CONTENT_URI, "_id=" + id, null); 21 Toast.makeText(SmsService.this, count == 1 ? "删除成功" : "删除失败", Toast.LENGTH_SHORT).show(); 22 } 23 } 24 25 }; 26 27 getContentResolver().registerContentObserver(Uri.parse("content://sms/"), true, mObserver);
转载至:http://blog.csdn.net/l173864930/article/details/17112227ide