Android手机上监听短信的两种方式


作者:徐建祥 (netpirate@gmail.com)
日期: 2010/08/10
网址: http://www.anymobile.org

Android 手机上监听短信有两种方式:

1、 接受系统的短信广播,操作短信内容。

优点:操作方便,适合简单的短信应用。

缺点:来信会在状态栏显示通知信息。

AndroidManifest.xml

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

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

<!-- Receiver -->

< receiver android:name = ".sms.SMSReceiver" >

< intent-filter >

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

</ intent-filter >

</ receiver >

code

package org.anymobile.demo.sms;

import android.content.BroadcastReceiver;

import android.content.Context;

import android.content.Intent;

import android.telephony.gsm.SmsMessage;

import android.util.Log;

public class SMSReceiver extends BroadcastReceiver

{

public static final String TAG = "ImiChatSMSReceiver" ;

//android.provider.Telephony.Sms.Intents

public static final String SMS_RECEIVED_ACTION = "android.provider.Telephony.SMS_RECEIVED" ;

@Override

public void onReceive(Context context, Intent intent)

{

if (intent.getAction().equals( SMS_RECEIVED_ACTION ))

{

SmsMessage[] messages = getMessagesFromIntent(intent);

for (SmsMessage message : messages)

{

Log.i ( TAG , message.getOriginatingAddress() + " : " +

message.getDisplayOriginatingAddress() + " : " +

message.getDisplayMessageBody() + " : " +

message.getTimestampMillis());

}

}

}

public final SmsMessage[] getMessagesFromIntent(Intent intent)

{

Object[] messages = (Object[]) intent.getSerializableExtra( "pdus" );

byte [][] pduObjs = new byte [messages. length ][];

for ( int i = 0; i < messages. length ; i++)

{

pduObjs[i] = ( byte []) messages[i];

}

byte [][] pdus = new byte [pduObjs. length ][];

int pduCount = pdus. length ;

SmsMessage[] msgs = new SmsMessage[pduCount];

for ( int i = 0; i < pduCount; i++)

{

pdus[i] = pduObjs[i];

msgs[i] = SmsMessage.createFromPdu (pdus[i]);

}

return msgs;

}

}

2、 应用观察者模式,监听短信数据库,操作短信内容。

优点:可以拦截来信在状态栏的显示通知,适合作短信拦截。

缺点:可以发展成 MU ,在后台悄悄的收 / 发短信。

实例如下:

SystemEventReceiver :收到开机启动 OK 的广播后,启动 BootService 服务;收到应用发送短信的 INTENT 后,调用系统接口发送短信

BootService :开启服务后,打开短信监听器

SMSObserver :数据观察者,监听短信数据库

SMSHandler :短信处理器

AndroidManifest.xml

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

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

<!-- Service -->

< service android:name = ".BootService"

android:label = "@string/app_name" >

< intent-filter >

< action android:name = "org.anymobile.test.service.IMICHAT" />

< category android:name = "android.intent.category.DEFAULT" />

</ intent-filter >

</ service >

<!-- Receiver -->

< receiver android:name = ".SystemEventReceiver" >

< intent-filter >

< action android:name = "android.intent.action.BOOT_COMPLETED" />

</ intent-filter >

</ receiver >

code

package org.anymobile.demo.sms;

import android.content.ContentUris;

import android.content.Context;

import android.content.Intent;

import android.net.Uri;

import android.os.Handler;

import android.os.Message;

import android.util.Log;

public class SMSHandler extends Handler

{

public static final String TAG = "SMSHandler" ;

private Context mContext ;

public SMSHandler(Context context)

{

super ();

this . mContext = context;

}

public void handleMessage(Message message)

{

Log.i ( TAG , "handleMessage: " + message);

MessageItem item = (MessageItem) message. obj ;

//delete the sms

Uri uri = ContentUris.withAppendedId (SMS. CONTENT_URI , item.getId());

mContext .getContentResolver().delete(uri, null , null );

Log.i ( TAG , "delete sms item: " + item);

}

}

package org.anymobile.demo.sms;

import android.content.ContentResolver;

import android.database.ContentObserver;

import android.database.Cursor;

import android.os.Handler;

import android.os.Message;

import android.util.Log;

public class SMSObserver extends ContentObserver

{

public static final String TAG = "SMSObserver" ;

private static final String[] PROJECTION = new String[]

{

SMS. _ID , //0

SMS. TYPE , //1

SMS. ADDRESS , //2

SMS. BODY , //3

SMS. DATE

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值