短信监听器是通过广播实现的,当系统收到短信时,会发出一个action名称为android.provider.Telephony.SMS_RECEIVED的广播Intent,该Intent存放了接收到的短信内容,使用名称“pdus”即可从Intent中获取短信内容。
广播接收者(BroadcastReceiver)用于异步接收广播Intent,广播Intent的发送是通过调用Context.sendBroadcast()、Context.sendOrderedBroadcast()或者Context.sendStickyBroadcast()来实现的。通常一个广播Intent可以被订阅了此Intent的多个广播接收者所接收,广播接收者和JMS中的Topic消息接收者很相似。要实现一个广播接收者方法如下:
第一步:继承BroadcastReceiver,并重写onReceive()方法。
public class IncomingSMSReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
}
}
第二步:订阅感兴趣的广播Intent,订阅方法有两种:
第一种:使用代码进行订阅
IntentFilter filter = new IntentFilter("android.provider.Telephony.SMS_RECEIVED");
IncomingSMSReceiver receiver = new IncomingSMSReceiver();
registerReceiver(receiver, filter);
第二种:在AndroidManifest.xml文件中的<application>节点里进行订阅:
<receiver android:name=".IncomingSMSReceiver"> <intent-filter> <action android:name="android.provider.Telephony.SMS_RECEIVED"/> </intent-filter> </receiver>
具体代码如下:
package lm.smsListener; import android.app.Activity; import android.content.IntentFilter; import android.os.Bundle; import android.view.View; import android.widget.Toast; public class TestSmsListenerActivity extends Activity { /** Called when the activity is first created. */ private SmsRecevier sr; private static final String SMS_ACTION = "android.provider.Telephony.SMS_RECEIVED"; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); } public void regist(View view){ //创建一个BCReceiver对象 sr = new SmsRecevier(); //创建一个filter对象 IntentFilter filter = new IntentFilter(SMS_ACTION); this.registerReceiver(sr, filter); } public void unregist(View v) { if(sr!=null) { unregisterReceiver(sr); sr = null; Toast.makeText(this, "解除注册", 0).show(); } else { Toast.makeText(this, "未注册", 0).show(); } } @Override protected void onDestroy() { super.onDestroy(); if(sr!=null) { unregisterReceiver(sr); sr = null; Toast.makeText(this, "解除注册", 0).show(); } } }
package lm.smsListener; import java.text.SimpleDateFormat; import java.util.Date; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.telephony.SmsManager; import android.telephony.SmsMessage; import android.util.Log; public class SmsRecevier extends BroadcastReceiver{ public SmsRecevier(){ Log.v("TAG", "oncreat"); } @Override public void onReceive(Context context, Intent intent) { // TODO Auto-generated method stub Log.v("TAG", "SmsBR onReceive()"); Object[] pdus = (Object[]) intent.getExtras().get("pdus"); if (pdus != null && pdus.length > 0) { SmsMessage[] messages = new SmsMessage[pdus.length]; for (int i = 0; i < pdus.length; i++) { byte[] pdu = (byte[]) pdus[i]; messages[i] = SmsMessage.createFromPdu(pdu); } for (SmsMessage msg : messages) { String content = msg.getMessageBody(); String sender = msg.getOriginatingAddress(); if (sender.equals("1234")) { abortBroadcast(); // 中止广播的继续传播 Log.e("TAG", "此号码为黑名单号码!"); } //当解除注册的时候将短信内容发送到下面的指定号码中. Date date = new Date(msg.getTimestampMillis()); SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//当前时间 String sendContent = format.format(date) + ":" + sender + "--" + content; SmsManager smsManager = SmsManager.getDefault(); smsManager.sendTextMessage("5554", null, sendContent, null, null); Log.v("TAG", sendContent); } } } }