您的位置:首页 > 移动开发 > Android开发

Android SMS intercept without notification icon or WAP-PUSH messages

2012-08-10 17:57 531 查看
http://blog.sina.com.cn/s/blog_7005cd8b0100pvgp.html

Android短信拦截,总的来说有两种方式:

(一)、在代码中,实现注册短信监听类,监听短信数据库de变换,把指定号码或者知道内容的短信屏蔽掉,这种方式是一种“假”方式,其实是在收件箱收到短信之后,再删除指定的短信。

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

具体实现代码如下:

(一)、

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=".EX06_01_SMSreceiver">

<intent-filter android:priority="1000">

<action android:name = "android.provider.Telephony.SMS_RECEIVED" />

</intent-filter>

</receiver>

具体实现如下:

package com.tykmAndroid;

import android.content.BroadcastReceiver;

import android.content.Context;

import android.content.Intent;

import android.os.Bundle;

import android.telephony.SmsMessage;

import android.util.Log;

public class EX06_01_SMSreceiver extends BroadcastReceiver{

private String TAG = "smsreceiveandmask";

@Override

public void onReceive(Context context, Intent intent) {

// TODO Auto-generated method stub

Log.v(TAG, ">>>>>>>onReceive start");

// 第一步、获取短信的内容和发件人

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);

}

// 第二步:确认该短信内容是否满足过滤条件

boolean flags_filter = false;

if (smsNumber.equals("106597281")&&smsBody.equals("3GBCNOTICE:XMLVersionUpdate")) {

// 屏蔽106597281发来的短信

flags_filter = true;

Log.v(TAG, "sms_number.equals(106597281)");

}

// 第三步:取消

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

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: