创建一个 Service 类,在该类的 onCreate() 方法中动态注册一个内部类,该类继承 BroadcastReceive。
IntentFilter filter = new IntentFilter();
filter.addAction("android.provider.Telephony.SMS_RECEIVED");
filter.setPriority(Integer.MAX_VALUE);
registerReceiver(new SmsReceiver(), filter);
addAction() 定义广播接收器类别——短信接收器。
在 Service 中添加一个继承 BroadcastReceive 的内部类,在该类中添加短信截获方法。
Bundle bundle = intent.getExtras();
if (bundle != null) {
Object[] pdusObjects = (Object[]) bundle.get("pdus");
SmsMessage[] messages = new SmsMessage[pdusObjects.length];
for (int i = 0; i < pdusObjects.length; i++) {
messages[i] = SmsMessage
.createFromPdu((byte[]) pdusObjects[i]);
}
for (SmsMessage message : messages) {
SMSAddress.append(message
.getDisplayOriginatingAddress());
SMSContent.append(message.getDisplayMessageBody());
System.out.println("来信号码:" + SMSAddress + "\n短信内容:"
+ SMSContent);
}
}
这样我们就能在 Logcat 中看到截获的内容了。
Service 同 Activity,需要在 Manifest.xml 中声明。
"cn.etzmico.service.SMSReceived"为 Service 的“标签”。
同时需要添加权限。
我们另外需要新建一个继承于 BroadcastReceiver 的类,区别于之前的,这个 Reveiver 是静态注册的,用于开机自启动。
在 onReceive() 中调用 Service。
ctx.startService(new Intent("cn.etzmico.SMSReceived"));
intent中的参数为要启动的 Service 的“标签”。
由于是静态注册,因此自启动类也需要在 Manifest.xml 中声明。
我们在这里也设置下优先级,方便短信截获。值同样为 Integer 最大值,不过需要用具体数值去表示。
最后别忘了权限。
好了,全部内容就是这些。
只要不被组织开机自启动,我们的程序是一定会截获到短信的。
至于文章中提到的疑惑,我还是想知道原因。希望了解的童鞋们留言给我~谢谢!
工程资源: