短信是手机中经常使用到的一种服务。然而,当手机接收到短信时,也会向系统发送广播。如果我们的应用程序要在手机接收到短信后做点什么,那就需要接收这个系统广播。
接收系统广播的步骤我们已经熟悉了,下面就按步就班地来完成这两个步骤。
1.编写一个SMSReceiver类来接收系统广播。
package
net.blogjava.mobile.sms;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.telephony.gsm.SmsMessage;
import android.widget.Toast;
public class SMSReceiver extends BroadcastReceiver
{
@Override
public void onReceive(Context context, Intent intent)
{
// 判断接收到的广播是否为收到短信的Broadcast Action
if ( " android.provider.Telephony.SMS_RECEIVED " .equals(intent.getAction()))
{
StringBuilder sb = new StringBuilder();
// 接收由SMS传过来的数据
Bundle bundle = intent.getExtras();
// 判断是否有数据
if (bundle != null )
{
// 通过pdus可以获得接收到的所有短信消息
Object[] objArray = (Object[]) bundle.get( " pdus " );
// 构建短信对象array,并依据收到的对象长度来创建array的大小
SmsMessage[] messages = new SmsMessage[objArray.length];
for ( int i = 0 ; i < objArray.length; i ++ )
{
messages = SmsMessage.createFromPdu(( byte []) objArray);
}
// 将送来的短信合并自定义信息于StringBuilder当中
for (SmsMessage currentMessage : messages)
{
sb.append( " 短信来源: " );
// 获得接收短信的电话号码
sb.append(currentMessage.getDisplayOriginatingAddress());
sb.append( " \n------短信内容------\n " );
// 获得短信的内容
sb.append(currentMessage.getDisplayMessageBody());
}
}
Intent mainIntent = new Intent(context, Main. class );
mainIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(mainIntent);
// 使用Toast信息提示框显示接收到的短信内容
Toast.makeText(context, sb.toString(), Toast.LENGTH_LONG).show();
}
}
}
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.telephony.gsm.SmsMessage;
import android.widget.Toast;
public class SMSReceiver extends BroadcastReceiver
{
@Override
public void onReceive(Context context, Intent intent)
{
// 判断接收到的广播是否为收到短信的Broadcast Action
if ( " android.provider.Telephony.SMS_RECEIVED " .equals(intent.getAction()))
{
StringBuilder sb = new StringBuilder();
// 接收由SMS传过来的数据
Bundle bundle = intent.getExtras();
// 判断是否有数据
if (bundle != null )
{
// 通过pdus可以获得接收到的所有短信消息
Object[] objArray = (Object[]) bundle.get( " pdus " );
// 构建短信对象array,并依据收到的对象长度来创建array的大小
SmsMessage[] messages = new SmsMessage[objArray.length];
for ( int i = 0 ; i < objArray.length; i ++ )
{
messages = SmsMessage.createFromPdu(( byte []) objArray);
}
// 将送来的短信合并自定义信息于StringBuilder当中
for (SmsMessage currentMessage : messages)
{
sb.append( " 短信来源: " );
// 获得接收短信的电话号码
sb.append(currentMessage.getDisplayOriginatingAddress());
sb.append( " \n------短信内容------\n " );
// 获得短信的内容
sb.append(currentMessage.getDisplayMessageBody());
}
}
Intent mainIntent = new Intent(context, Main. class );
mainIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(mainIntent);
// 使用Toast信息提示框显示接收到的短信内容
Toast.makeText(context, sb.toString(), Toast.LENGTH_LONG).show();
}
}
}
在编写SMSReceiver类时需要注意如下4点:
- 接收短信的Broadcast Action是android.provider.Telephony.SMS_RECEIVED,因此,要在onReceiver方法的开始部分判断接收到的是否是接收短信的Broadcast Action。
- 需要通过Bundle.get("pdus")来获得接收到的短信消息。这个方法返回了一个表示短信内容的数组。每一个数组元素表示一条短信。这就意味着通过Bundle.get("pdus")可以返回多条系统接收到的短信内容。
- 通过Bundle.get("pdus")返回的数组一般不能直接使用,需要使用SmsMessage.createFromPdu方法将这些数组元素转换成SmsMessage对象才可以使用。每一个SmsMessage对象表示一条短信。
- 通过SmsMessage类的getDisplayOriginatingAddress方法可以获得发送短信的电话号码。通过getDisplayMessageBody方法可以获得短信的内容。
<
receiver
android:name
="SMSReceiver"
>
< intent-filter >
<!-- 指定SMSReceiver可以接收的Broadcast Action -->
< action android:name ="android.provider.Telephony.SMS_RECEIVED" />
</ intent-filter >
</ receiver >
< intent-filter >
<!-- 指定SMSReceiver可以接收的Broadcast Action -->
< action android:name ="android.provider.Telephony.SMS_RECEIVED" />
</ intent-filter >
</ receiver >
为了使应用程序可以成功地接收SMS_RECEIVED广播,还需要使用<uses-permission>标签为应用程序打开接收短信的权限,代码如下:
<
uses-permission
android:name
="android.permission.RECEIVE_SMS"
></
uses-permission
>
现在启动应用程序,界面上会显示“等待接收短信...”的信息。那么这里还有一个问题。如果我们在模拟器上测试这个程序呢?
解决这个问题并不难,Android模拟器不仅可以模拟程序的运行,还可以模拟手机的很多动作,例如,发短信就是其中之一。要模拟手机的动作,仍然要求助于DDMS透视图。在DDMS透视图中有一个【Emulator Control】视图(如果DDMS中没有这个视图,请读者通过Eclipse的【Window】>【Show View】菜单项来显示这个视图)。在【Telephone Actions】分组框,选中SMS选项框,并在【Incomingnumber】文本框中输入一个电话号,然后在【Message】文本框中输入要发送的短信内容,最后单击【Send】按钮来模拟发送短信。输入相应信息后的【Emulator Control】视图如图1所示。当单击【Send】按钮后,手机模拟器就会接收到短信,不管接收短信的应用程序是否启动,都会显示如图2所示的显示短信内容的Toast信息提示框。