短信拦截
使用内部注册广播接收者的方式来注册短信到来的广播接收者 短信到来的广播接收者,和拦截黑名单服务生命周期绑定在一起, 服务开启,接收者也注册 // 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"字眼,也给拦截了 |