衆所周知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