接收数据短信到一个端口

Receiving data sms to only one port

我在清单中找到了接收器:

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

和我的接收器class

public class SMSReceiver extends BroadcastReceiver {

@Override
public void onReceive(Context context, Intent intent) {
    final Bundle bundle = intent.getExtras();
    SmsMessage[] messages = null;
    String text = "";
    byte[] data = null;

    if (bundle != null){
        Object[] pdus = (Object[]) bundle.get("pdus");
        for (int i = 0; i < pdus.length; i++){
            messages = new SmsMessage[pdus.length];
            messages[i] = SmsMessage.createFromPdu((byte[]) pdus[i]);
            String phoneNumber = messages[i].getOriginatingAddress();
            try {
                data = messages[i].getUserData();
            } catch (Exception e){

            }
            String hex = byteArrayToHex(data);
            Toast toast = Toast.makeText(context,
                    "senderNum: "+ phoneNumber + ", message: " + hex, Toast.LENGTH_LONG);
            Log.d("mylog","senderNum: "+ phoneNumber + ", message: " + text);
            toast.show();
        }
    }
}

public static String byteArrayToHex(byte[] a) {
    StringBuilder sb = new StringBuilder(a.length * 2);
    for(byte b: a)
        sb.append(String.format("%02x", b & 0xff));
    return sb.toString();
}

它工作正常,我正在接收我的数据短信。 但是,我也正在接收到其他端口的数据短信。 看起来过滤器 <data android:port="10013"/> 不起作用.. 有什么建议吗?

您需要为 <intent-filter> 上的 <data> 以及 schemehostport 指定一个 host需要全部在一个 <data> 元素中。

还建议在 <receiver> 中包含一个 permission 以防止欺骗。

<receiver android:name=".receiver.SMSReceiver"
    android:permission="android.permission.BROADCAST_SMS">
    <intent-filter>
        <action android:name="android.intent.action.DATA_SMS_RECEIVED"/>
        <data
            android:scheme="sms"
            android:host="localhost"
            android:port="10013" /> 
    </intent-filter>
</receiver>