短信监听器是通过广播实现的,当系统收到短信时,会发出一个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);
}
}
}
}