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");
}
}
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");
}
}
相关文章推荐
- 【Android】Share via facebook with appName or without appName 有标签、无标签
- Android 5.0 notification icon is blank square
- 关于Android Notification Bar icon setSmallIcon 显示为白板或白色的问题
- android.app.Notification.Notification(int icon, CharSequence tickerText, long when)翻译
- Android notification icon 变成白色
- Android无布局文件下自定义通知栏notification的 icon
- windows系统通知区域编程(SystemTray or NotificationIcon)
- How To Create a Full Android Phone or Tablet Backup Without Rooting or Unlocking Your Device
- Notification bar icon turns white in Android 5 Lollipop
- Android 消息推送(notification) 标题栏icon不显示内容
- Backup your Android without root or custom recovery -- adb backup
- Android5.0+ 新Notification smallIcon
- Android notification动态设置网络图片icon
- Android系统的图标设计规范 icon 大小
- android Notification 的使用
- docker 解决:Get http:///var/run/docker.sock/v1.19/version: dial unix /var/run/docker.sock: no such file or directory. Are you trying to connect to a TLS-enabled daemon without TLS?
- Android requires compiler compliance level 5.0 or 6.0. Found '1.7' instead. Please use Android Tool
- Android SMS —— 读取短信 联系人
- Android Push Notification实现信息推送使用
- android实现桌面icon未读信息图标(类似与iPhone的badge)