作者:徐建祥 (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 |