Android短信拦截的一些发现

来源:互联网 发布:淘宝安全中心网页 编辑:程序博客网 时间:2024/06/03 19:07

本文中提到的源码位置:
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;     }

总结

本文不是归纳短信拦截的方法,只是提供一种拦截的方法。如果我的文章对你的工作和学习有帮助,请在下方评论告诉我好吗?

原创粉丝点击