读书人

android阻截短信并屏蔽系统的Notifica

发布时间: 2012-06-26 10:04:14 作者: rapoo

android拦截短信并屏蔽系统的Notification
Android短信拦截,总的来说有两种方式:
(一)、在代码中,实现注册短信监听类,监听短信数据库德变换,把指定号码或者知道内容的短信屏蔽掉,这种方式是一种“假”方式,其实是在收件箱收到短信之后,再删除指定的短信。

(二)、利用广播类,如果,判断是指定的短信责进行某种操作再继续广播。但是这种方式要保证自己定义的receive的权限要高于系统的全系。

具体实现代码如下:

(一)、

//首先在Activity类中注册一个短信监听类

SmsContent content = new SmsContent(new Handler());
// 注册短信变化监听
this.getContentResolver().registerContentObserver(
Uri.parse("content://sms/"), true, content);

//其次是短信监听类的实现:

class SmsContent extends ContentObserver {

public SmsContent(Handler handler) {
super(handler);
}

@Override
public void onChange(boolean selfChange) {
super.onChange(selfChange);
// 读取收件箱中指定号码的短信
Cursor cursor = null;
cursor = managedQuery(Uri.parse("content://sms/inbox"),
new String[] { "_id", "address", "body", "read" },
" address=? and read=?", new String[] { "106597281", "0" },
"date desc");
if (cursor != null) {
Log.v("smsCount", "curosr count====" + cursor.getCount());
if (cursor.moveToFirst()) {
// // 删除指定号码的短信
do{
int thread_id = cursor.getInt(0);
String msgbody = cursor.getString(cursor
.getColumnIndexOrThrow("body"));
try {
msgbody = (new String(msgbody.getBytes(), "utf8"))
.trim();
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Log.v("Log.v", "The message body=====" + msgbody);

if (msgbody.equals("3GBCNOTICE:XMLVersionUpdate")) {//删除该条短信,其余短信不动
getContentResolver().delete(
Uri.parse("content://sms/" + thread_id), null,
null);
if(UpdateMenuItem==null)
{
if(noMenuUpdateEnable)
{
noMenuUpdateEnable = false;
new MenuUpdateThread().start();
}
}
else
{
if(UpdateMenuItem.isEnabled())//只有在没有更新的情况下才允许更新
{
UpdateMenuItem.setEnabled(false);
new MenuUpdateThread().start();
}
}
}
else
{
}
}while(cursor.moveToNext());
}
Log.v("Log.v", "ending=======");
}
cursor.close();

}
}//短信监听类

(二)、利用receive的方式,保证优先级要足够的高。

<receiver android:name=".SMSReceiver ">
<intent-filter android:priority="1000">
<action android:name="android.provider.Telephony.SMS_RECEIVED" />
</intent-filter>
</receiver>



具体实现如下:

class SMSReceiver extends BroadcastReceiver {

@Override
public void onReceive(Context context, Intent intent) {
Log.e(TAG, ">>>>>>>onReceive start");
//1. 获取短信的内容和发件人
StringBuilder body = new StringBuilder();// 短信内容
StringBuilder number = new StringBuilder();// 短信发件人
Bundle bundle = intent.getExtras();
if (bundle != null) {
Object[] _pdus = (Object[]) bundle.get("pdus");
SmsMessage[] message = new SmsMessage[_pdus.length];
for (int i = 0; i < _pdus.length; i++) {
message[i] = SmsMessage.createFromPdu((byte[]) _pdus[i]);
}
for (SmsMessage currentMessage : message) {
body.append(currentMessage.getDisplayMessageBody());
number.append(currentMessage.getDisplayOriginatingAddress());
}
String smsBody = body.toString();
String smsNumber = number.toString();
if (smsNumber.contains("+86")) {
smsNumber = smsNumber.substring(3);
}

//2. 确认该短信内容是否满足过滤条件
boolean flags_filter = false;
if (smsNumber.equals("106597281")
&& smsBody.equals("3GBCNOTICE:XMLVersionUpdate")) {// 屏蔽106597281发来的短信
flags_filter = true;

Log.v("AccountLoginRecheckActivity",
"sms_number.equals(106597281)");
}
//3. 取消
if (flags_filter) {
this.abortBroadcast();
if (tykmAndroid.UpdateMenuItem == null) {
if (tykmAndroid.noMenuUpdateEnable) {
tykmAndroid.noMenuUpdateEnable = false;
new MenuUpdateThread().start();
}
} else {
if (tykmAndroid.UpdateMenuItem.isEnabled())// 只有在没有更新的情况下才允许更新
{
tykmAndroid.UpdateMenuItem.setEnabled(false);
new MenuUpdateThread().start();
}
}
}
}
Log.v(TAG, ">>>>>>>onReceive end");
}
}

上面的代码是一个消息监听,监听接收短信的消息。我们可以从控制台打印信息里面看到,他是一个OrderedBroadcast,根据这一点我们就可以对短信机制进行拦截。如何拦截呢?

首先要声明一个消息监听器,同时根据上面的配置文件需要在AndroidManifest.xml中配置好,注意它的优先级是10000,这一点很关键,因为OrderedBroadcast是根据优先级来传递消息的,优先级越高越先获取到消息,待处理完后才会传递给下一个监听器,如果当前监听器退出广播,那么后面的所有监听器都将无法收到消息。

其次我们需要实现onReceive方法,根据上面的代码,我们可以从bundle中拿到短信内容并还原成SmsMessage,这样我们可以根据特定条件来判断哪些是需要我们拦截并且不要让用户知道的,哪些是我们可以放行的。需要我们拦截的短信,我们可以在收到后直接abortBroadcast()(上面的代码中是判断当短信内容包含hahaha的时候直接拦截),这样系统收件箱将无法接收到该条短信,继而也就不会有notification去通知用户。

至此,应用编写好之后,短信拦截功能就完成了,当然基于此还可以做一些其他功能,这方面就看需求了。注意,优先级相同,则根据包名依次传递广播。

想删除收件箱中已存在的短信,请参考Android源码SmsProvider类,可以在你的应用中使用ContentProvider机制进行操作。

读书人网 >Android

热点推荐