您的位置:首页 > 移动开发 > Android开发

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

一、通过删除短信数据库中的数据实现拦截(发送)

话不多少,直接上代码。

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;
}


总结

本文不是归纳短信拦截的方法,只是提供一种拦截的方法。如果我的文章对你的工作和学习有帮助,请在下方评论告诉我好吗?
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息