创建一个 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 中声明。
<service android:name="cn.etzmico.smsreceived.SMSReceivedService" > <intent-filter > <action android:name="cn.etzmico.service.SMSReceived" /> <category android:name="android.intent.category.default" /> </intent-filter> </service>"cn.etzmico.service.SMSReceived"为 Service 的“标签”。
同时需要添加权限。
<uses-permission android:name="android.permission.RECEIVE_SMS" />
我们另外需要新建一个继承于 BroadcastReceiver 的类,区别于之前的,这个 Reveiver 是静态注册的,用于开机自启动。
在 onReceive() 中调用 Service。
ctx.startService(new Intent("cn.etzmico.SMSReceived"));intent中的参数为要启动的 Service 的“标签”。
由于是静态注册,因此自启动类也需要在 Manifest.xml 中声明。
<receiver android:name=".BootReceiver" > <intent-filter android:priority="2147483647" > <action android:name="android.intent.action.BOOT_COMPLETED" /> <category android:name="android.intent.category.HOME" /> </intent-filter> </receiver>我们在这里也设置下优先级,方便短信截获。值同样为 Integer 最大值,不过需要用具体数值去表示。
最后别忘了权限。
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
好了,全部内容就是这些。
只要不被组织开机自启动,我们的程序是一定会截获到短信的。
至于文章中提到的疑惑,我还是想知道原因。希望了解的童鞋们留言给我~谢谢!
工程资源: