广播接收者实现短信拦截器

时间:2022-11-18 08:58:17

1,系统在收到短息时,会产生一条短信广播,短信广播里,包含了短信的发信人号码和短信的内容,短信应用之所以能收到短信,其实是收到了短信广播。

2,为了介绍priority(优先级),这里做一个小案例,除了接收广播短信外,还要对特定的短信实现拦截功能。要想实现拦截短信的功能,就要在短信应用在拿到广播之前,把短信广播拦截,那么短信应用就不会收到广播。

3,广播接收者的代码如下:

<span style="font-size:14px;">public class SmsReceiver extends BroadcastReceiver{

/**
* 从广播中取出短信的过程:
* 1,从intent中取出bundle(短信在广播时存在了bundle中)
* 2,以pdus为key取出Object数组,Object中的每个元素都是一条短信
* 3,通过Object构造出一个短信对象
* 4,通过短信对象来获取发信人号码及短信内容
*/
//intent:广播发送时使用的intent
@Override
public void onReceive(Context context, Intent intent) {
// TODO Auto-generated method stub
Bundle bundle = intent.getExtras();
// 数组中的每个元素都是一条短信
Object[] objects = (Object[])bundle.get("pdus");
for (Object object : objects) {
// 通过pdu创建短信对象
SmsMessage sms = SmsMessage.createFromPdu((byte[]) object);
// 获取发信人的号码
String address = sms.getOriginatingAddress();
// 获取短信内容
String body = sms.getMessageBody();
System.out.println(address+"-----"+body);
// 实现短信拦截功能
if ("138438".equals(address)) {
// 阻止其他广播接收者接收这条短信,类似于拦截.
// 注意:需在清单文件里配置优先级,不然拦截不成功
abortBroadcast();
}
}
}
}</span>

4,BroadcastReceiver和其他三个组件一样,在使用之前都需在清单文件中进行配置:

<span style="font-size:14px;"><?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.stopSms"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="19" />
    <!-- 需添加接收短信的权限 -->
    <uses-permission android:name="android.permission.RECEIVE_SMS"/>

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="com.example.stopSms.MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <receiver 
            android:name="com.example.stopSms.SmsReceiver">
            <!-- 要实现拦截功能,需要设置优先级(-1000~1000) -->
            <intent-filter  android:priority="1000">
                <!-- 短信广播需要手写(Alt+/ 无提示) -->
                <action android:name="android.provider.Telephony.SMS_RECEIVED"/>
            </intent-filter>
        </receiver>
    </application>

</manifest></span>


5,Activity中不需要实现什么功能,这里不再给出。