当手机收到短信时,会发出一个与之相关的系统广播——短信广播,表示广播类型的字符串为android.provider.Telephony.SMS_RECEIVED,下面是监听短信
,并且取出收发短信者的电话号码和短信内容的例子
(1)广播监听器类
public class MSGBroadcastReceiver extends BroadcastReceiver {
public String type="android.provider.Telephony.SMS_RECEIVED";
@Override
public void onReceive(Context context, Intent intent)
//取出短信的电话和内容组成的字符串
String inf = this.getInf(intent);
Toast.makeText(context, inf, Toast.LENGTH_LONG).show();
}
//返回短信的电话和内容组成的字符串
private String getInf(Intent intent) {
if (intent.getAction().equals(type)) {
/* 创建字符串变量sb */
StringBuilder sb = new StringBuilder();
/** 接收由Intent传来的数据 */
Bundle bundle = intent.getExtras();
/** 判断Intent有无数据 */
if (bundle != null) {
/**
* pdus为 android内置短信参数 identifier 通过bundle.get("")返回一包含pdus对象ン
*/
Object[] myOBJpdus = (Object[]) bundle.get("pdus");
/* 构建短信对象array,并根据收到的对象长度来定义array的大小 */
SmsMessage[] messages = new SmsMessage[myOBJpdus.length];
for (int i = 0; i < messages.length; i++) {
messages[i] = SmsMessage
.createFromPdu((byte[]) myOBJpdus[i]);
}
/* 把传来的短信合并定义在stringbuffer中 */
for (SmsMessage currentMessage : messages) {
sb.append("接收到来自:\n");
/* 发送人电话号码 */
sb.append(currentMessage.getDisplayOriginatingAddress());
sb.append("\n------传来的短信------\n");
/* 取得传来的信息 */
sb.append(currentMessage.getDisplayMessageBody());
}
}
/* 以(Toase)形式展示 */
return sb.toString();
}
return "";
}
}
(2)在AndroidManifest.xml文件中注册广播接收器和配置短信权限
<?xml version="1.0" encoding="utf-8"?>
<manifest ......>
<application ......>
......
<!--注册广播接收器监听短信,短信的广播类型为android.provider.Telephony.SMS_RECEIVED-->
<receiver android:name="MSGBroadcastReceiver类的包名.MSGBroadcastReceiver">
<intent-filter>
<action android:name="android.provider.Telephony.SMS_RECEIVED" />
</intent-filter>
</receiver>
</application>
......
<!--配置权限-->
<uses-permission android:name="android.permission.RECEIVE_SMS"></uses-permission>
</manifest>