Androidx学习笔记(57)--- 短信拦截器

来源:互联网 发布:scdma是什么网络类型 编辑:程序博客网 时间:2024/05/01 01:30


系统收到短信时会产生一条广播,广播中包含了短信的号码和内容

  • 定义广播接收者接收短信广播

    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>



0 0
原创粉丝点击