Android短信拦截的一些发现
2017-10-27 11:31
281 查看
本文中提到的源码位置:
mtk:
vendor\mediatek\proprietary\packages\apps\Mms\src\com\android\mms\transaction\SmsReceiverService.java
Native:
packages\apps\Mms\src\com\android\mms\transaction\SmsReceiverService.java
上面的代码非常简单,没什么好说的。值得说一下的是type,它的含义如下所示:
1:inbox
2:sent
3:draft
4:outbox
5:failed
6:queued
frameworks\opt\telephony\src\java\com\android\internal\telephony\SmsApplication.java
我们以”com.chen.mms”这个程序为例,我们要实现该应用发送的短信全部不存入数据库中,只需在该方法中添加:
说完发送,下面我们来说说接收。
Mms\src\com\android\mms\transaction\SmsReceiverService.java
老样子,直接上代码:
在上面方法中加入过滤,就会屏蔽掉接收到短信的提醒,举个栗子:我们要屏蔽包含“Android”和“android”的短信
在上述方法中加入过滤,让它返回null,系统就不会把改短信写入数据库,举个栗子:我们要屏蔽包含“Android”和“android”的短信
mtk:
vendor\mediatek\proprietary\packages\apps\Mms\src\com\android\mms\transaction\SmsReceiverService.java
Native:
packages\apps\Mms\src\com\android\mms\transaction\SmsReceiverService.java
一、通过删除短信数据库中的数据实现拦截(发送)
话不多少,直接上代码。ContentResolver cr=getContentResolver(); Uri urisms=Uri.parse("content://sms/"); Cursor c=cr.query(urisms,new String[]{"_id", "thread_id"}, null, null, null); if(null!=c && c.moveToFirst()){ do{ long threadid=c.getLong(1); String ss=c.getString(0)+c.getString(1); cr.delete(Uri.parse("content://sms/"), "(address=? or address = ? or address = ? or address = ? or address = ? or address = ?) and type !=?", new String[] {"13684945093", "+8613684945093","13684945092","+861069022160043","1896581482682","+861368566844","1"}); Log.d("deleteSMS", "threadId:: "+threadid); }while(c.moveToNext()); } }catch (Exception e) { // TODO: handle exception e.printStackTrace(); }
上面的代码非常简单,没什么好说的。值得说一下的是type,它的含义如下所示:
1:inbox
2:sent
3:draft
4:outbox
5:failed
6:queued
在源码中删除发送的短信的位置
在 private void handleSendMessage()方法中执行删除逻辑即可,发送短信会调用这个方法。(原来网上有很多不错的介绍,这里不再说明了)二、不让发送的短信存入数据库
这种方法无疑是从根本上解决法拦截发送短信的需求。在讲具体怎么做之前,给大家科普一下一个小知识:在Android4.4之前的版本中,第三方应用发送的短信是不会存入短信数据库中的;但是在4.4开始,Android对sms framework架构做了修改,引入了default application的概念,因此发送的短信都会存入短信数据库中。在android的短信发送机制里面,有一个方法判断是都需要存入数据库之中,那就是shouldWriteMessageForPackage(),位于源码中的位置:frameworks\opt\telephony\src\java\com\android\internal\telephony\SmsApplication.java
我们以”com.chen.mms”这个程序为例,我们要实现该应用发送的短信全部不存入数据库中,只需在该方法中添加:
if((packageName != null) && packageName.equals("com.chen.mms")){ return false; }
说完发送,下面我们来说说接收。
三、拦截收到的短信
1、收到短信不提醒
代码路径:Mms\src\com\android\mms\transaction\SmsReceiverService.java
老样子,直接上代码:
private void handleSmsReceived(Intent intent, int error)
在上面方法中加入过滤,就会屏蔽掉接收到短信的提醒,举个栗子:我们要屏蔽包含“Android”和“android”的短信
SmsMessage tmpsms = msgs[0]; try{ String ss =URLDecoder.decode(tmpsms.getMessageBody(), "UTF-8"); if(ss.indexOf("Android")!=-1||ss.indexOf("android")!=-1){ return; }
2、收到的短信不存入数据库
private Uri insertMessage(Context context, SmsMessage[] msgs, int error, String format)
在上述方法中加入过滤,让它返回null,系统就不会把改短信写入数据库,举个栗子:我们要屏蔽包含“Android”和“android”的短信
SmsMessage sms = msgs[0]; String body = sms.getMessageBody(); if(body.indexOf("Android")!=-1||body.indexOf("android")!=-1){ return null; }
总结
本文不是归纳短信拦截的方法,只是提供一种拦截的方法。如果我的文章对你的工作和学习有帮助,请在下方评论告诉我好吗?相关文章推荐
- 对于android拦截短信的一些疑问
- android短信拦截
- 如何在Android 4.4上实现短信拦截
- android 中listview集成checkbox后使用的一些发现
- android 编写拦截拦截短信的service
- android 使用广播 接收和拦截 android系统短信
- android安全漏洞(五) 抢先拦截短信 - 结果篇
- Androidの短信拦截方法详解
- android 拦截短信并屏蔽
- Android开发——短信电话拦截/接听电话
- android手机短信拦截的实现
- Android BroadcastReceiver之短信拦截(黑名单)
- Android项目:手机安全卫士(12)—— 通讯卫士之电话短信黑名单设置与拦截
- 【慢慢学Android】:5.短信拦截
- Android中如何在QQ通讯录,360之前拦截短信
- [android] 手机卫士黑名单功能(短信拦截)
- Android系统级开发进程清理功能的一些记录和发现(一)
- android短信和电话拦截