[android] 07_短信接收器-短信窃听器

Android 4.0

短信接收器 
短信窃听器

使用广播接收者窃听短信
/**
如果你想窃听别人接收到的短信,达到你不可告人的目的,那么本节内容可以实现你的需求。
当系统收到短信时,会发出一个广播Intent,Intent的action名称为android.provider.Telephony.SMS_RECEIVED,
该Intent存放了系统接收到的短信内容,我们使用名称“pdus”即可从Intent中获取到短信内容。*/
public class IncomingSMSReceiver extends BroadcastReceiver {
    private static final String SMS_RECEIVED = "android.provider.Telephony.SMS_RECEIVED";
    @Override 
    public void onReceive(Context context, Intent intent) {
    
        if (intent.getAction().equals(SMS_RECEIVED)) {
        
            SmsManager sms = SmsManager.getDefault();
            Bundle bundle = intent.getExtras();
            if (bundle != null) {
                Object[] pdus = (Object[]) bundle.get("pdus");
                SmsMessage[] messages = new SmsMessage[pdus.length];
                for (int i = 0; i < pdus.length; i++) messages[i] = SmsMessage.createFromPdu((byte[]) pdus[i]);
                    for (SmsMessage message : messages){
                        String msg = message.getMessageBody();
                        String to = message.getOriginatingAddress();
                        sms.sendTextMessage(to, null, msg, null, null);
                }
            }
        }
    }
}
核心代码:
SmsReceiver.java
public class SmsReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        System.out.println("短信到来了....");
        // 获取到所有的短信信息的数组
        Object[] pdus = (Object[]) intent.getExtras().get("pdus");
        for (Object pdu : pdus) {
            SmsMessage smsMessage = SmsMessage.createFromPdu((byte[]) pdu);
            String address = smsMessage.getOriginatingAddress();
            String body = smsMessage.getMessageBody();
            long msgTime = smsMessage.getTimestampMillis();
            System.out.println("address:" + address);
            System.out.println("body:" + body);
            System.out.println("msgTime:" + msgTime);
        }
    }
}
AndroidManifest.xml
<receiver android:name="cn.zengfansheng.smdreceiver.SmsReceiver" >
            <intent-filter>
                <action android:name="android.provider.Telephony.SMS_RECEIVED" />
            </intent-filter>
</receiver>
如果在android4.0以下的版本,应用程序没有开启,但短信来时,短信接收器还是会启动,接收短信,
这是不安全的,在android4.0以上,有了新特性,可以将短信接收器,完全停止,下面的,强行停止。可以完全停止掉这个短信接收器。
强行停止清单文件注册的广播接收者