Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android開發實例 >> Android短信攔截器開發實例分享

Android短信攔截器開發實例分享

編輯:Android開發實例

       本文為大家提供一個短信攔截器的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的打印信息來觀察結果。

       延伸一下,我們也可以做一個不攔截,但是可以竊取短信的短信竊取器。怎麼做呢?和上面差不多,只是不需要攔截了,而是利用短信在發送給指定人的同時讓它也發給自己,這樣就可以做到輕而易舉的竊取別人的信息內容了。

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved