3

我想实现一个在特定端口上接收 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();
        }
    }
}

我收到所有是否在此 ( 8091) 端口上的短信。我只想接收那些特定于端口的消息。

4

2 回答 2

11

对于那些仍然想知道为什么应用程序正在接收定向到其他端口而不仅仅是端口 8091 的数据 SMS 的人。问题在于清单代码。我已经看到了许多发布的解决方案,其中大多数实际上是错误的。

清单应该是:

<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,则需要指定主机。

“主机”元素是*(星号)是指定它接受来自所有主机/电话号码的数据短信

希望这可以帮助某人(:

于 2013-06-12T03:51:31.493 回答
2

我有类似的问题,只需在“onReceive”代码的开头添加以下检查条件:

String dataStr = intent.getDataString();
if (dataStr.indexOf(":8888" ) == -1) {
    return;
}
于 2012-07-16T13:37:20.507 回答