当系统短信时,会对外发送一个广播,该广播的Intent的action 为 <action android:name="android.provider.Telephony.SMS_RECEIVED"
.因此只要在程序中开发一个对应的 BroadcastReceiver 即可监听到系统的短信.
自定义 Receiver
package com.test.systembroadcast;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.telephony.SmsMessage;
import android.widget.Toast;
public class MySmsReceiver extends BroadcastReceiver {
public MySmsReceiver() {
}
@Override //当接收到短信的时 触发
public void onReceive(Context context, Intent intent) {
// TODO: This method is called when the BroadcastReceiver is receiving
// an Intent broadcast.
//如果接收到的短信的Action 等于系统 短信的intent action
if (intent.getAction().equals("android.provider.Telephony.SMS_RECEIVED")) {
//取消广播 (这行代码会让系统收不到短信)
abortBroadcast();
StringBuilder sb = new StringBuilder();
//接收由 SMS 传过来的数据
Bundle bundle = intent.getExtras();
//判断是否有数据
if (bundle != null) {
//通过 pdus 可以获得接收到的所有的短信消息
// pdu为承载着一条短信的所有短信。
// 一条短信为140个英文字符长度,在这个长度范围内,即需一个pdu即可。超出这个范围,即要分割成多个pdu数组。
Object[] pdus = (Object[]) bundle.get("pdus");
//构建短信对象数组,并依据接收到的对象长度来创建数组的大小
SmsMessage[] messages = new SmsMessage[pdus.length];
for (int i = 0; i < pdus.length; i++) {
messages[i] = SmsMessage.createFromPdu((byte[]) pdus[i]);
}
//将发送来的短信合并成自定义信息于 StringBuilder 中
for (SmsMessage msg : messages) {
sb.append("短信来源: ")
//获得接收短息的号码
.append(msg.getDisplayOriginatingAddress())
.append("\n-------------短信内容---------\n")
//获得短信息内容
.append(msg.getDisplayMessageBody());
}
}
Toast.makeText(context, sb.toString(), Toast.LENGTH_LONG).show();
}
}
}
在清单文件中配置代码如下 : <intent-filter android:priority="1000">
<action android:name="com.test.systembroadcast.SMG" />
<action android:name="android.provider.Telephony.SMS_RECEIVED" />
</intent-filter>
权限 <uses-permission android:name="android.permission.SEND_SMS"/>
<uses-permission android:name="android.permission.RECEIVE_SMS"/>