5

SMSを介して他のデバイスと通信するアプリケーションを作成しています。

受信したSMSのリスナーを実装することができました。問題は、受信したすべてのメッセージをリッスンしているということです。特定の番号から受信した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

異なる電話番号形式 (+4XXXX、0XXXX...) があるため、PhoneNumberUtils.compare()を使用して電話番号を比較します。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

私の知る限り、意図だけで数値をフィルタリングする方法はありません。

できることは、次のようにレシーバーで電話番号を取得することです。

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

受信した SMS の通知を避けることはできません。

ただし、関心のある番号に適合しない SMS は破棄できます。

電話すれば番号がわかる

= 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 に答える