系统收到短信时会产生一条广播,广播中包含了短信的号码和内容
-
定义广播接收者接收短信广播
public void onReceive(Context context, Intent intent) { //拿到广播里携带的短信内容 Bundle bundle = intent.getExtras(); Object[] objects = (Object[]) bundle.get("pdus"); for(Object ob : objects ){ //通过object对象创建一个短信对象 SmsMessage sms = SmsMessage.createFromPdu((byte[])ob); System.out.println(sms.getMessageBody()); System.out.println(sms.getOriginatingAddress()); }
}
- 系统创建广播时,把短信存放到一个数组,然后把数据以pdus为key存入bundle,再把bundle存入intent
-
清单文件中配置广播接收者接收的广播类型,注意要设置优先级属性,要保证优先级高于短信应用,才可以实现拦截
<receiver android:name="com.exp.smslistener.SmsReceiver"> <intent-filter android:priority="1000"> <action android:name="
android.provider.Telephony.SMS_RECEIVED
"/> </intent-filter> </receiver>
-
添加权限
<uses-permission android:name="android.permission.RECEIVE_SMS"/>
-
4.0以后广播接收者安装以后必须手动启动一次,否则不生效
- 4.0以后广播接收者如果被手动关闭,就不会再启动了
代码
public class SmsReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
//拿到短信的信息
//短信内容封装在intent中
Bundle bundle = intent.getExtras();
//以pdus为键,取出一个object数组,数组中的每一个元素,都是一条短信
//pdu:协议数据单元 pdu在这里代表的就是短信
Object[] objects = (Object[]) bundle.get("pdus");
//拿到广播中的所有短信
for (Object object : objects) {
//通过pdu来构造短信
SmsMessage sms = SmsMessage.createFromPdu((byte[])object);
//这里使用的模拟数据13800138000 该数据应该从数据库中获取
if(sms.getOriginatingAddress().equals("13800138000")){
//阻止其他广播接收者收到这条广播
abortBroadcast();
// SmsManager.getDefault().sendTextMessage(sms.getOriginatingAddress(), null, "你是个好人", null, null);
}
// System.out.println(sms.getMessageBody());
}
}
}
AndroidManifest.xml
在该文件中进行配置优先级和Action
<receiver android:name="com.exp.smslanjie.SmsReceiver">
<!--此处要配置优先级 范围-1000~1000 -->
<intent-filter android:priority="1000">
<action android:name="android.provider.Telephony.SMS_RECEIVED"/>
</intent-filter>
</receiver>