5

我正在编写一个通过 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();
}
4

6 回答 6

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
                }
            }
        }
    }
于 2012-07-24T10:41:52.370 回答
4

AFAIK 无法仅按意图过滤数字。

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

SMSMesssage msg=SMSMessage.creatFromPdu(pdu)
String origination_no = msg.getDisplayOriginatingAddress()
于 2012-07-24T10:42:15.760 回答
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.
    }                    
}
于 2012-07-24T10:40:25.910 回答
1

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

于 2012-07-24T10:42:14.817 回答
1

恐怕您无法避免收到收到任何短信的通知。

但是,您可以丢弃任何与您感兴趣的号码不符的短信。

您可以通过拨打电话获取号码

来自 = smsMessage[i].getOriginatingAddress() 的字符串;

关联

于 2012-07-24T10:43:57.343 回答
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);
    }

来源

于 2016-09-05T22:52:11.860 回答