[mobilesafe] 06_短信拦截

Android 4.0

短信拦截

使用内部注册广播接收者的方式来注册短信到来的广播接收者
短信到来的广播接收者,和拦截黑名单服务生命周期绑定在一起,
服务开启,接收者也注册
// 0、服务开启时
@Override
public void onCreate() {
    super.onCreate();
    // 服务开启时,注册内部短信接收者
    innerSmsSafeReceiver = new InnerSmsSafeReceiver();
    IntentFilter filter = new IntentFilter();
    filter.addAction("android.provider.Telephony.SMS_RECEIVED");
    filter.setPriority(IntentFilter.SYSTEM_HIGH_PRIORITY);// 最高优先级
    registerReceiver(innerSmsSafeReceiver, filter);
}  
服务停止,接收者取消注册
// 1、服务停止时
@Override
public void onDestroy() {
    super.onDestroy();
    // 服务停止时,取消注册内部短信接收者
    unregisterReceiver(innerSmsSafeReceiver);
    innerSmsSafeReceiver = null;
}
短信拦截核心代码:
/**
 * 6、内部短信广播接收者,和黑名单拦截服务绑定在一起
 * @author hacket
 */
private class InnerSmsSafeReceiver extends BroadcastReceiver {
    private static final String TAG = "InnerSmsSafeReceiver";
    @Override
    public void onReceive(Context context, Intent intent) {// 内部的短信广播接收者
        Log.i(TAG"内部短信接收者,接收到了短信~");
        // 1、获取所有的短信
        Object[] objects = (Object[]) intent.getExtras().get("pdus");
        // 2、遍历短信
        for (Object object : objects) {
            // 3、获取SmsMessage对象
            SmsMessage smsMessage = SmsMessage.createFromPdu((byte[]) object);
            // 4、获取短信发件人号码
            String address = smsMessage.getOriginatingAddress();//短信发件人号码
            // 4-1获取黑名单拦截模式
            String blackNumberMode = blackNumberDao.getBlackNumberMode(address);
            // 4-2如果在黑名单中,那么模式不为null,基于黑名单号码拦截
            if (!TextUtils.isEmpty(blackNumberMode)) {
                if (MODE_SMS.equals(blackNumberMode)|| MODE_ALL.equals(blackNumberMode)) {// 此黑名单短信拦截
                    Log.i(TAG"黑名单号码,短信拦截:" + address);
                    abortBroadcast();
                }
            }
            // 5、获取短信内容,短信垃圾,基于关键字拦截,如果短信有某个关键字,就拦截掉该短信
            String body = smsMessage.getMessageBody();//短信内容
            if ("fapiao".equals(body)) {
                Log.i(TAG"黑名单拦截,垃圾短信,短信拦截:" + body);
                abortBroadcast();
            }
        }
    }
}
结果:
模拟110,发来短信,给拦截了

模拟其他号码,但短信内容有"fapiao"字眼,也给拦截了