当前位置:阳光沙滩 >Android > 查看文章

1.关于短信拦截

我们都知道,在某60或者一些安全软件或者一此流氓软件里,总有一些拦截短信的功能,那么它们是怎么样实现的呢?

接下來就尝试着去实现一下这个功能。

2.分析

分析:首先这事应该是使用服务去完成的,所以呢,我们的界面很简单,只是两个按钮,然后的话,就是开启短信拦截服务,和取消短信拦截服务。

之后呢,就应该创建服务,广播接收者,再把这个优先级别设置高到最高,拦截短信,之后呢,就停止掉短信的广播。因为短信广播是一个有序的广播。

在前面的文章也提到。广播分为无序广播和有序广播。下面也顺便说说这两种广播的特点吧:

有序广播:优先级高的应用先接收到广播,并且可以对广播进行操作,甚至可以停止广播的继续。

无序广播:没有优先级之分,各应用程序同时收到广播,所以呢,就谈不上什么优先级了,更不用说对广播的修改了。

3. 代码实现

好啦,接下來,先把UI完成,这个太简单了,只有两个按钮!

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <Button
        android:id="@+id/bt_start_service"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="开启短信拦截服务" />

    <Button
        android:id="@+id/bt_stop_service"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="开启短信拦截服务" />

</LinearLayout>

%e7%9f%ad%e4%bf%a1%e6%8b%a6%e6%88%aa

有了界面之后呢,我们就可以去写服务啦,不达呀,在写服务的时候,建议大家要在服务里头的onCreate方法加入一个日志输出,测试 一下服务是否启动成功,养成这样的习惯,因为有时个可能会忘记注册,或者没能注册成功。但是,系统不给出提示,这是比较坑的地方!,同时还要注册一个短信接收权限。

<uses-permission android:name="android.permission.RECEIVE_SMS"/>

以下是界面的代码,用于启动服务,以及停止服务!

package com.sunofbeaches.smsintersection;

import com.sunofbeaches.smsintersection.service.IntersectionService;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;

public class MainActivity extends Activity implements OnClickListener {
	private Button bt_start_service;
	private Button bt_stop_service;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		// 初始化界面
		initView();
		// 事件
		initEvent();

	}

	private void initView() {
		bt_start_service = (Button) findViewById(R.id.bt_start_service);
		bt_stop_service = (Button) findViewById(R.id.bt_stop_service);
	}

	private void initEvent() {
		bt_start_service.setOnClickListener(this);
		bt_start_service.setOnClickListener(this);
	}

	@Override
	public void onClick(View v) {
		Intent service = null;
		if (v == bt_start_service) {
			// 开启短信拦截服务
			service = new Intent(this, IntersectionService.class);
			startService(service);
		} else if (v == bt_stop_service) {
			// 停止短信拦截
			stopService(service);
		}
	}
}

服务的代码,包括服务开启时的注册一个接收者,和这个服务销毁时把这个接收者取消注册。

package com.sunofbeaches.smsintersection.service;

import android.app.Service;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.IBinder;
import android.telephony.SmsMessage;
import android.util.Log;

public class IntersectionService extends Service {
	SMSReceiver receiver;

	@Override
	public IBinder onBind(Intent intent) {
		// TODO Auto-generated method stub
		return null;
	}

	// 定一个广播接收者
	public class SMSReceiver extends BroadcastReceiver {

		@Override
		public void onReceive(Context context, Intent intent) {
			Log.d("message", "进來接收者了");
			// 解析短信内容,模板代码(必须记的嘛)
			Object[] objects = (Object[]) intent.getExtras().get("pdus");
			for (Object object : objects) {
				SmsMessage sms = SmsMessage.createFromPdu((byte[]) object);
				String number = sms.getOriginatingAddress();// 获取到短信的地址
				String msg = sms.getMessageBody();// 获取到短信的内容

				// 其实我们关心的是号码,因为我们以号码來拦截嘛,当然,内容包含敏感词汇也是拦截的哈,嘻嘻!

				Log.d("message", number + "number");
				// 这里呢,就只实现号码的拦截
				if ("5556".equals(number)) {
					Log.d("message", "来自" + number + "的短信已经拦截");
					// 终止短信的广播
					this.abortBroadcast();
				}
				/* 当然这里的号码在实际开发中是在数据库里头获取的 */
			}
		}

	}

	/**
	 * 服务开启
	 */
	@Override
	public void onCreate() {
		super.onCreate();
		// 服务开启
		Log.d("message", "onCreate----service");

		// 动态注册这个广播接收者,这样的话,这个服务关闭了,接收者也没了。
		receiver = new SMSReceiver();

		// 创建过滤器
		IntentFilter filter = new IntentFilter();
		// 设置优先级别(最高为1000,最低为-1000)
		filter.setPriority(1000);
		// 添加监听的action
		filter.addAction("android.provider.Telephony.SMS_RECEIVED");
		// 注册接收者
		this.registerReceiver(receiver, filter);
	}

	/**
	 * 服务销毁
	 */
	@Override
	public void onDestroy() {
		super.onDestroy();
		// 服务消费的话,就取消这个接收者的注册
		this.unregisterReceiver(receiver);
	}

}

 

7K
为您推荐
各种观点