О порте SMS для Android

Я хочу реализовать приложение, которое получает SMS на конкретном порту.

Код манифеста:

<receiver android:name=".BinarySMSReceiver"> <intent-filter> <action android:name="android.intent.action.DATA_SMS_RECEIVED"/> <data android:port="8091"/> <data android:scheme="sms"/> </intent-filter> </receiver> 

И код класса получателя ниже.

 public class BinarySMSReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { Bundle bundle = intent.getExtras(); SmsMessage[] msgs = null; if(null != bundle) { String info = "Binary SMS from "; Object[] pdus = (Object[]) bundle.get("pdus"); msgs = new SmsMessage[pdus.length]; byte[] data = null; for (int i=0; i<msgs.length; i++){ msgs[i] = SmsMessage.createFromPdu((byte[])pdus[i]); info += msgs[i].getOriginatingAddress(); info += "\n*****BINARY MESSAGE*****\n"; data = msgs[i].getUserData(); for(int index=0; index<data.length; ++index) { info += Character.toString((char)data[index]); } } Toast.makeText(context, info, Toast.LENGTH_SHORT).show(); } } } 

Я получаю все SMS, которые находятся в этом ( 8091 ) порту или нет. Я хочу получать только те сообщения, которые являются специфическими для порта.

Для тех, кто все еще задается вопросом, почему приложение получает данные SMS, направленные на другие порты, а не только на порт 8091. Проблема заключается в коде манифеста. Я видел много решений, которые были опубликованы, и большинство из них на самом деле ошибочны.

Манифест должен быть:

 <receiver android:name = ".SmsReceiver"> <intent-filter> <action android:name="android.intent.action.DATA_SMS_RECEIVED" /> <data android:scheme="sms" android:host="*" android:port="8095" /> </intent-filter> </receiver> 

Атрибуты схемы, хоста и порта должны быть определены только в одном элементе «данных» фильтра намерения, а не в отдельных элементах данных.

Кроме того, не из этой ссылки в разделе «проверка данных» говорится, что
«Хост и порт вместе составляют полномочия URI, если хост не указан, порт игнорируется».
Поэтому имейте в виду, что вам нужно указать хост, если вы хотите, чтобы приложение получало SMS-сообщения данных только для определенного порта.

Элементом «host» является * (звездочка), чтобы указать, что он принимает данные SMS со всех хостов / телефонных номеров

Надеюсь, это поможет кому-то (:

У меня была аналогичная проблема, просто добавьте следующее условие проверки при запуске вашего кода onReceive:

 String dataStr = intent.getDataString(); if (dataStr.indexOf(":8888" ) == -1) { return; }