Android广播组件实践——短信黑名单

转载请注明出处:http://blog.csdn.net/chengbao315/article/details/51011358

相关阅读:

Android服务组件案例:http://blog.csdn.net/chengbao315/article/details/50997218

上回书我提到了想要编写安卓四大组件案例的想法,那么说到做到,这次我就来做一个Android广播组件的案例。这次想要模仿手机360软件的短信黑名单功能,可以实现号码加入黑名单,后台运行程序,短信来到时进行拦截,并可以在软件中查看信息内容的基本功能。比如这个手机360软件的截图:

读了郭神的《第一行代码》,再加上之前几篇博客的总结,我对这个功能的实现胸有成竹,不过没有思路的童鞋也不用急,请参考《第一行代码》第5章、第8章内容。

下面来实现功能,在Eclipse中新建一个Android项目,打开activity_main.xml文件,编写界面布局。这里只简单实现需求功能,所以布局起来比较简单,只包含几个TextView控件、一个EditText控件和一个Button控件,设计代码如下:

<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" >

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:orientation="horizontal" >

        <TextView
            android:id="@+id/textView1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginLeft="10dp"
            android:layout_marginTop="10dp"
            android:text="@string/EnterNum" />

        <EditText
            android:id="@+id/editNumber"
            android:layout_width="150dp"
            android:layout_height="wrap_content"/>

    </LinearLayout>

    <Button
        android:id="@+id/btnAddBlack"
        android:layout_width="200dp"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal"
        android:text="加入黑名单" />

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="60dp" >

        <TextView
            android:id="@+id/senderText"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:padding="10dp"
            android:layout_gravity="bottom"
            android:text="黑名单号码:" />

        <TextView
            android:id="@+id/sender"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="bottom" />
    </LinearLayout>
    
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <TextView
            android:id="@+id/contentText"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:padding="10dp"
            android:text="信息内容:" />

        <TextView
            android:id="@+id/content"
            android:layout_width="210dp"
            android:layout_height="280dp" />

    </LinearLayout>

</LinearLayout>

以上代码实现的效果如图所示:

接下来实现接收信息的功能。安卓手机在接收短信的时候,系统会发出一条值为android.provider.Telephony.SMS_RECEIVED的广播,这条广播里携带着与短信相关的所有数据。通过对这条广播的监听,在接收到广播时对信息内容进行解析,根据发送号码判断决定是否截断广播,即可实现短信黑名单的功能。

打开MainActivity.java 文件,在onCreate()方法中添加动态注册监听短信广播的代码,同时获取信息号码、信息内容TextView和Button的实例,添加代码如下:

public class MainActivity extends Activity implements OnClickListener {
    private TextView sender;
    private TextView content;
    private IntentFilter receiveFilter;
    private MessageReceiver messageReceiver;
    private static String BlackNum = "";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        sender = (TextView) findViewById(R.id.sender);
        content = (TextView) findViewById(R.id.content);
        Button btnAdd = (Button) findViewById(R.id.btnAddBlack);
        btnAdd.setOnClickListener(this);

        receiveFilter = new IntentFilter();
        receiveFilter.addAction("android.provider.Telephony.SMS_RECEIVED");
        receiveFilter.setPriority(100);
        messageReceiver = new MessageReceiver();
        registerReceiver(messageReceiver, receiveFilter);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        unregisterReceiver(messageReceiver);
    }

为了实现软件先于手机自带信息软件收到信息,通过调用 receiveFilter.setPriority(100);方法设置软件的优先级较高。接下来在MainActivity中新建MessageReceiver内部类,继承BroadcastReceiver,实现接收广播后的处理逻辑,代码如下所示:

private class MessageReceiver extends BroadcastReceiver {

		@Override
		public void onReceive(Context context, Intent intent) {
			Log.d("MessageReceiver", "Receive");
			Bundle bundle = intent.getExtras();
			Object[] pdus = (Object[]) bundle.get("pdus");
			SmsMessage[] message = new SmsMessage[pdus.length];
			for (int i = 0; i < message.length; i++) {
				message[i] = SmsMessage.createFromPdu((byte[]) pdus[i]);
			}
			// 获取手机号码
			String Number = message[0].getOriginatingAddress();
			String fullMessage = "";
			for (SmsMessage m : message) {
				fullMessage += m.getMessageBody();// 获取短信内容
			}
			Log.d("MessageReceiver[Number]", Number);
			Log.d("MessageReceiver[Message]", fullMessage);
			if (BlackNum.equals(Number)) {
				NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
				Notification notification = new Notification(
						R.drawable.ic_launcher, "拦截黑名单信息",
						System.currentTimeMillis());
				Intent notificationIntent = new Intent(context,
						MainActivity.class);
				PendingIntent pendingIntent = PendingIntent.getActivity(
						context, 0, notificationIntent, 0);
				notification.setLatestEventInfo(context, "新信息", "拦截黑名单信息",
						pendingIntent);
				notification.defaults = Notification.DEFAULT_ALL;
				manager.notify(1, notification);

				sender.setText(Number);
				content.setText(fullMessage);
				abortBroadcast();
			}
		}
	}

在接收到广播后,系统调用onReceive()方法,通过Bundle方式传递信息数据,通过对Bundle的解析,将信息内容存储到一个SmsMessage数组中,进而完成信息的接收。接下来对比来信号码与黑名单号码是否相等,如果相等,给出一个通知(这里不是需求的要求内容,以后再详细讲),在界面显示信息号码和信息内容,同时截断广播向手机的信息软件传播。

最后别忘了在AndroidManifest.xml中的代码中给程序声明一个接收短信的权限"android.permission.RECEIVE_SMS"(另一个权限是手机通知的震动权限),添加代码如下:

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

以上代码实现了软件接收信息和拦截信息的功能,但是设置黑名单的功能还没有实现,继续编辑MainActivity.java文件,添加Button的监听代码,在代码中获取EditText的内容,保存为黑名单号码,添加代码如下:

public class MainActivity extends Activity implements OnClickListener {
	......

	@Override
	public void onClick(View view) {
		EditText text = (EditText) findViewById(R.id.editNumber);
		if (!text.getText().toString().isEmpty()) {
			BlackNum = text.getText().toString();
			Toast.makeText(this, "设置黑名单号码为:" + BlackNum, Toast.LENGTH_LONG)
					.show();
			Log.d("MainActivity[Number]", BlackNum);
		}
	}
}

还有一个隐含的功能,就是后台运行,其实这段代码完全可以不写,通过按Home键代替,但是提到了还是实现以下吧。其实原理很简单,就是捕捉Back点击事件,然后设置为后台运行,在MainActivity中继续添加代码如下:

	@Override
	public boolean onKeyDown(int keyCode, KeyEvent event) {
		if (keyCode == KeyEvent.KEYCODE_BACK) {
			moveTaskToBack(true);
			return true;
		}
		return super.onKeyDown(keyCode, event);
	}

激动人心的时刻到了,最后的最后就是来进行测试了。在郭神的《第一行代码》中,提供了DDMS模拟器的方法(可以参考8.2.1章节),但是我的电脑根本没装模拟器,又不想花信息费,那怎么办?机智的我决定给10086发信息吧,结果查了一下午的话费,估计10086也快疯了。测试结果如下:

  

下载源码,点击这里!

时间: 2024-11-05 04:55:53

Android广播组件实践——短信黑名单的相关文章

Android短信的发送和广播接收者实现短信的监听

原文地址:http://www.cnblogs.com/zyw-205520/archive/2013/01/24/2875686.html Android短信的发送和广播接收者实现短信的监听  要注意Android清单中权限的设置以及广播的注册监听实现 以下就是 Android清单的XML AndroidManifest.xml <manifest xmlns:android="http://schemas.android.com/apk/res/android" packag

android: 接收和发送短信

8.2    接收和发送短信 收发短信应该是每个手机最基本的功能之一了,即使是许多年前的老手机也都会具备这 项功能,而 Android 作为出色的智能手机操作系统,自然也少不了在这方面的支持.每个 Android 手机都会内置一个短信应用程序,使用它就可以轻松地完成收发短信的操作,如 图 8.4 所示. 图   8.4 不过作为一名开发者,仅仅满足于此显然是不够的.你要知道,Android 还提供了一系 列的 API,使得我们甚至可以在自己的应用程序里接收和发送短信.也就是说,只要你有足 够的信

Android接收和发送短信

每一部手机都具有短信接收和发送功能,下面我们通过代码来实现接收和发送短信功能. 一.接收短信 1.创建内部广播接收器类,接收系统发出的短信广播 2.从获得的内容中解析出短信发送者和短信内容 3.在Activity中注册广播 4.添加接收短信权限 下面放上具体的代码 activity_main.xml文件用于显示短信发送者号码和显示短信内容 <?xml version="1.0" encoding="utf-8"?> <RelativeLayout

扣丁学堂笔记第11天广播接收器、短信与闹钟服务

1.默认广播 MainActivity package com.example.broadcastreceivertest; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.view.View; public class MainActivity extends Activity { @Override protected void onCre

向android模拟器打电话发短信的简单方法

在开发android应用程序时,有时候需要测试一下向android手机拨打电话发送短信时该应用程序的反应.譬如编写一个广播接收器,来提示用户有短信收到或者处理短信,就需要向该手机发送短信来进行测试.这里介绍一种简单的向android模拟器打电话发短信的方法. 该方法利用了eclipse ADT的DDMS来实现,首先点击打开DDMS,在eclipse界面的右上角,如图: 如果找不到,就点左边的图标,再点击others就会看到. 打开之后,在界面的左边中部会看见有一个Emulator Control

Android 2.3发短信详细流程

在android中,APP通过SmsManager.java一系列方法实现发送短信的功能,而发送的内容有很很多种,比如sendTextMessage.sendMultipartTextMessage.sendDataMessage等等,在这篇文章里我们就以其中一个为例阐述发送短信的完整流程,如果有不对的地方,请大家指正,一起学习. 1. 起点:SmsManager.java (frameworks/base/telephony/java/android/telephony/SmsManager.

【转】如何向Android模拟器打电话发短信

转载地址:http://hi.baidu.com/jeremylai/item/420f9c9fe4881fccb62531f7 1. 启动Android Emulator, 查看标题栏找出端口.一般是android emulator(5554),其中5554就是端口. 2. 打开命令行,输入telnet localhost 5554.程序将会连接到android emulator,控制台会返回 Android Console: type ‘help’ for a list of command

Android 监听系统短信广播

使用场景: 1.对系统接收到的短信进行识别,是广告或者是诈骗等 2.对短信内容进行过滤或者是对内容进行提取,比如验证码提取 3.对系统短信进行拦截,连系统自己都不让收到了(不会出现在系统数据里面,也不会有系统短信的通知栏提示) 备注: 1.系统短信广播为有序广播,要拦截的话,需要在注册广播的时候设置广播优先级为最大,不过这种也有风险,如果被其他的应用先拦截了,那么我们将不再收到,使用时需注意. 2.要接到系统短信广播,那么应用必须具备短信读取权限,这对使用者来说可能是一个限制 3.除了短信读取权

通过广播者实现短信的拦截

在Android中的四大组件中的广播接收者(BroadcastReceiver):可以用于监听 / 接收 应用发出的广播消息,并做出响应. 所以,通过这个自然而然的可以实现短信的拦截. 先定义一个SmsListenerRecevicer类来继承BroadcastReceiver.在里面实现短信的拦截 1 package cn.starry.smsListener; 2 3 import android.content.BroadcastReceiver; 4 import android.con