Android新姿势:如何截取短信

公司要做一个【因为是机密所以不能说】的项目,有个需求是拦截手机系统的短信,而且不能在手机的短信应用上显示。

OK,一开始以为不难,网上查了一下资料也发现有人做过,于是就开始写demo,结果才发现,这尼玛就是个大坑啊!!

首先网上查到的最多的实现方案是利用自定义的 BroadcastReceiver 去拦截"android.provider.Telephony.SMS_RECEIVED" 的广播,看起来也不难,于是试了下。发现好坑爹啊!在我的酷派大神上无论怎么样就是拦截不到~

好吧,一定是我写代码的姿势不对,所以又到网上查资料。

嚯嚯嚯,我果然机智~~ 一下子就找到了!原来是我的优先级不够。

安卓的广播是有优先级的,并且动态注册的广播优先级更高。于是参考网上说的,优先级设到2147483647,又弄个动态注册,然后兴奋的用我的酷派再试一次——但还是不行!

详见:http://www.apkbus.com/forum.php?mod=viewthread&tid=53053

郁闷,难道是我手机的问题?好吧,拿一个同事的2.3安卓机试了一下,还真的可以。。。难道真是手机问题?不行,多拿几台试一下。于是再拿其他同事的手机了一下,也跟我一样。那么大概就可以确定了,是手机系统版本不一样,因为其他同事都是4.0以上的手机。

好吧虽然原因找到,但总得想办法解决是吧?

网上关于拦截短信的资料虽然比较少,不过还是有提到其他的方法的。另一个方法就是监听数据库发生变化时去删除短信的数据。也就是在插入新信息的时候把新信息删了,这样也算是拦截。

网上的资料是注册一个内容提供者监听"content://sms/" 的数据变化,按照他写的代码试了,还是可以监听到数据库变化的。

详见:http://bingtian.iteye.com/blog/641566

但是,在4.0以上系统cursor居然是空的(2.3的手机没问题)!

TUT好坑爹啊!到底毛回事啊!

好吧,耐心的我又想到另一个onChange(boolean selfChange, Uri uri),这个带Uri参数的方法是高版本的安卓系统上才有的,所以我在这里把uri打印了出来。结果发现打印出来的都是content://sms/910、content://sms/911之类的,根本就没有content://sms/inbox。那么也怪不得cursor是空的!

好吧,既然content://sms/inbox查不到,那我就查你给我的uri吧~

首先把该uri的字段打印出来:

_id;thread_id;address;m_size;person;date;date_sent;protocol;read;status;type;reply_path_present;subject;body;service_center;locked;sim_id;error_code;seen;ipmsg_id;ref_id;total_len;rec_len;itemInfoid;receive_date;

再跟2.3系统的content://sms/inbox字段对比一下:

_id;thread_id;address;person;date;sc_timestamp;protocol;read;status;type;reply_path_present;subject;body;service_center;locked;error_code;seen;lgeMsgType;lgeSiid;lgeCreated;lgeExpires;lgeReceived;lgeAction;lgeSec;lgeMac;lgeDoc;doInstalled;lgePinRemainCnt;index_on_icc;service_msg_sender_address;modified;modified_time;

有些字段是不一样的,不过一些主要的字段如_id、address、body还是一样的。

那么要拿到短信的内容跟发件人的号码还是没问题的,address就是发件人号码,body是短信内容。试了一下,可以拿到。

比较担心的就是能不能删除掉数据库里的这些短信,不过试了一下还是可以的~

就结果而言还不错——成功的拦截到短信,并把短信删掉了,系统虽然会“叮~”的一声提醒来短信了,但是显示的却不是我刚发的短信,而是我上一次发的(刚发的已经被删了)。

总结:既然不能在这棵树上吊死,就多找几课树试试。

时间: 2024-08-24 07:11:04

Android新姿势:如何截取短信的相关文章

转: 如何在Android 4.4上实现短信拦截

众所周知Android在4.4上增加了不少安全措施,除了把SELinux设置为enforce外,在短信方向也加强了限制. 4.4之后,新增了一个default sms的机制,详细的描述,可以参考我的另一篇文章<谈谈4.4中的新增功能对安全类软件的影响>.简而言之,就是如果要在4.4之后实现短信拦截功能,就必须成为default sms,把所有短信相关的功能都包揽了,然后再做短信拦截.但这种做法,适配性和兼容性的工作是非常巨大的,短信.wapush(多种).彩信.单双卡等等,相当于要求短信拦截类

Android学习--写一个发送短信的apk,注意布局文件的处理过程!!!

刚开始写Android程序如图发现使用了findViewById方法之后输出的话居然是null(空指针错误),也就是说这个方法没有成功.网上说这样写是在activity_main .xml去找这个ID所代表的控件,而现在使用的ADT在layout下除了activity_main .xml还多生成了一个fragment_main.xml.我就是把控件写在了后一个布局文件中.想请问下,使用什么样的方法是在fragment_main.xml去寻找控件呢? 回答:在PlaceHolderFragment

Android:调用打电话和发短信及intent一些其他用法

1.打电话 可以自己写界面,在button的单击事件中添加如下代码即可: Intent intent = new Intent();    intent.setAction("android.intent.action.CALL");    intent.setData(Uri.parse("tel:"+ mobile));//mobile为你要拨打的电话号码,模拟器中为模拟器编号也可    startActivity(intent); 需要添加打电话权限: <

android 中调用接口发送短信

android中可以通过两种方式发送短信 第一:调用系统短信接口直接发送短信:主要代码如下: Java代码   //直接调用短信接口发短信 SmsManager smsManager = SmsManager.getDefault(); List<String> divideContents = smsManager.divideMessage(content); for (String text : divideContents) { smsManager.sendTextMessage(&

[android]ShareSDK——内容分享和短信验证

前言 新版本号ShareSDK的分享和短信验证,按官网的文档,都须要加入一个<Activity></Activity>标签,而分享和短息验证的这个标签内容都一样.会冲突. 解决的方法:分享用旧版本号,短信验证用新版本号. 后面会有解决的方法. 分享 导入project见初识ShareSDK--嵌入和登陆 <span style="font-size:24px;">OnekeyShare oks = new OnekeyShare(); //全部SSO

[android] 手机卫士手机实现短信指令获取位置

获取位置  新建一个service的包 新建一个GPSService类继承系统的Service类 清单文件中注册一下 重写onCreate()方法,服务创建的时候回调 重写onDestroy()方法,服务销毁的时候回调 把上一节的代码拿到这个地方来 得到用户移动后的最后一次的位置,保存到SP中 转换标准坐标为火星坐标,数据库文件放到assets目录下,把ModifyOffset.java放在service包下面 获取ModifyOffset对象,通过ModifyOffset.getInstanc

Android手机——读取手机电话+短信+网页+图片+音乐+视频+APK+通知栏消息+换头像

Android手机--电话+短信+网页+图片+音乐+视频+APK+通知栏消息+换头像 <!--拨打电话权限--> <uses-permission android:name="android.permission.CALL_PHONE"/> <!--连接网络权限--> <uses-permission android:name="android.permission.INTERNET"/> <!--读写文件的权限

phoneGap的Android下编写phonegap 发送短信插件

一.前端代码的编写 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>jQuery Mobile Web 应用程序</title> <link href="jquery.mobile-1.3.2.css" rel="stylesheet" type="text/css"/>

Android 监听获取手机短信内容

Android开发的时候,有时候需要获取手机信息内容的情况,这里有种获取发送过来信息的监听方法: public class SmsReciver extends BroadcastReceiver{} //2,获取短信内容 Object[] objects = (Object[]) intent.getExtras().get("pdus"); //3,循环遍历短信过程 for (Object object : objects) { //4,获取短信对象 SmsMessage sms