拦截短信的实现
public class SmsActivity extends Activity{
private ReceiveSmsReceiver receiver2;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_sms);
receiver2 = new ReceiveSmsReceiver();
IntentFilter filter2 = new IntentFilter("android.provider.Telephony.SMS_RECEIVED");
this.registerReceiver(receiver2,filter2);
}
@Override
protected void onDestroy() {
this.unregisterReceiver(receiver2);
super.onDestroy();
}
/**
* 拦截短信的广播接收器
*/
class ReceiveSmsReceiver extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
//获取短信内容以及Number
//协议数据单元PDU
Object[] objs = (Object[]) intent.getExtras().get("pdus");
//遍历每条短信
for(Object obj:objs){
byte[] data = (byte[])obj;
SmsMessage sms = SmsMessage.createFromPdu(data);
String body = sms.getDisplayMessageBody();
String number = sms.getDisplayOriginatingAddress();
Log.i("TTT","number:"+number);
Log.i("TTT","body:"+body);
if(body.contains("fapiao")||number.equals("5556")){
//拦截短信,不再向后继续传播
//系统广播接收器 就接收不到了
abortBroadcast();
}
}
}
}
}
如果短信内容包含“fapiao”或者号码为"5556"的短信就会被拦截
可以看到,第一条"hi"和第三条"hello"都能正常接收,第二条“fapiao11”被拦截了
同时我们看一下打印的日志

4.4问题
拦截短信的功能这样就做好了,不幸的是,这是在4.4以下的手机中运行的效果
4.4之后,新增了一个default sms的机制,详细的描述,可以参考https://android-developers.googleblog.com/2013/10/getting-your-sms-apps-ready-for-kitkat.html
简而言之,就是如果要在4.4之后实现短信拦截功能,就必须成为default sms,把所有短信相关的功能都包揽了,然后再做短信拦截。但这种做法,适配性和兼容性的工作是非常巨大的,短信、wapush(多种)、彩信、单双卡等等,相当于要求短信拦截类的软件要集成一个功能非常完善的通讯录类应用的功能。
那么…一般的应用不会用到拦截短信功能,如果你真的在写一个短信应用,那么你可以自行百度下如何让自己应用成为默认短信应用