针对特定号码的Android SMS Listener

时间:2012-07-24 10:32:53

标签: android sms

我正在编写一个通过短信与其他设备通信的应用程序。

我能够为收到的短信实现一个监听器。问题在于它正在收听所有收到的消息。我想只收听特定号码的收到的短信。

这是我的onReceive方法。

@Override
public void onReceive(Context context, Intent intent) {
    // TODO Auto-generated method stub
    Bundle bundle = intent.getExtras();

    Object messages[] = (Object[]) bundle.get("pdus");
    SmsMessage smsMessage[] = new SmsMessage[messages.length];
    for (int n = 0; n < messages.length; n++) {
        smsMessage[n] = SmsMessage.createFromPdu((byte[]) messages[n]);
    }

    // show first message
    Toast toast = Toast.makeText(context,
                  "Received SMS: " + smsMessage[0].getMessageBody(),
                  Toast.LENGTH_LONG);
    toast.show();
}

6 个答案:

答案 0 :(得分:4)

使用PhoneNumberUtils.compare()比较电话号码,因为有不同的电话号码格式(+ 4XXXX,0XXXX ...)。您可以通过getOriginatingAddress()获取发件人。

public class SmsReceiver 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)) {
            Bundle bundle = intent.getExtras();
            if (bundle != null) {
                // get sms objects
                Object[] pdus = (Object[]) bundle.get("pdus");
                if (pdus.length == 0) {
                    return;
                }
                // large message might be broken into many
                SmsMessage[] messages = new SmsMessage[pdus.length];
                StringBuilder sb = new StringBuilder();
                for (int i = 0; i < pdus.length; i++) {
                    messages[i] = SmsMessage.createFromPdu((byte[]) pdus[i]);
                    sb.append(messages[i].getMessageBody());
                }
                String sender = messages[0].getOriginatingAddress();
                String message = sb.toString();
                // apply sms filter
                if (PhoneNumberUtils.compare("your number", sender)) {
                    // do something
                }
            }
        }
    }

答案 1 :(得分:4)

AFAIK无法通过意图来过滤数字。

您可以做的是在接收器中获取电话号码,如下所示:

SMSMesssage msg=SMSMessage.creatFromPdu(pdu)
String origination_no = msg.getDisplayOriginatingAddress()

答案 2 :(得分:3)

使用此

for(int i=0; i<smsMessage.length; i++) {
    smsMessage[i] = SmsMessage.createFromPdu((byte[])pdus[i]);
    String msg_from = msgs[i].getOriginatingAddress();
    Log.v("msg_from >>",msg_from);     
    if(msg_from.equals("1234556"))
    {
        //do you stuff here.
    }                    
}

答案 3 :(得分:1)

您可以使用message.getOriginatingAddress()获取收到邮件的号码,并根据您获得的地址进行进一步计算。

答案 4 :(得分:1)

我担心您无法避免收到您收到的任何短信的通知。

但是,您可以丢弃任何不符合您感兴趣的数字的短信。

您可以致电

获取电话号码
  

来自= smsMessage [i] .getOriginatingAddress();

的字符串

Link

答案 5 :(得分:0)

对于那些拥有此creatFromPdu的人,请弃用我们对实际api和旧api的验证....

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        String format = bundle.getString("format");
        currentSMS = SmsMessage.createFromPdu((byte[]) aObject, format);
    } else {
        currentSMS = SmsMessage.createFromPdu((byte[]) aObject);
    }

source