如何过滤sendDataMessage接收器,使它们尊重端口

时间:2015-08-02 20:40:42

标签: android broadcastreceiver intentfilter smsmanager

用于发送"数据的Android API" SMS消息是sendDataMessage(),它接受​​端口参数。在接收应用的AndroidManifest中,您可以指定接收方正在侦听的端口。但我发现,当我在目标设备上有多个应用程序时,每个应用程序都在另一个端口上进行侦听,每个传入的消息都会广播给所有这些应用程序。

我怀疑我没有错误地进行过滤。这是我的过滤器和发送代码。有什么想法吗?

来自AndroidManifest.xml

<receiver android:name="NBSReceiver" >
  <intent-filter>
    <action android:name="android.intent.action.DATA_SMS_RECEIVED" /> 
    <data android:scheme="sms"
          android:port="@string/nbs_port"
          /> 
  </intent-filter>
</receiver>

发送代码:

    SmsManager smgr = SmsManager.getDefault();
    short nbsPort = (short)Integer.parseInt( getString( R.string.nbs_port ) );
    byte[] bytes = "A message".getBytes();
    smgr.sendDataMessage( phone, null, nbsPort, bytes,
                          null, null );

在intent-filter中,我尝试将名称和方案放在单独的数据元素中,并添加android:host="*"。没什么区别。某些组合会阻止所有传入的消息,但是如果我设置过滤器以便将消息发送到nbs_port,它也会将消息发送到其他端口。我在其他端口注册的其他应用程序会收到此消息。

最后,接收代码:

@Override
public void onReceive( Context context, Intent intent )
{
    String action = intent.getAction();
    if ( action.equals("android.intent.action.DATA_SMS_RECEIVED") ) {
        Bundle bundle = intent.getExtras();
        if ( null != bundle ) {
            Object[] pdus = (Object[])bundle.get( "pdus" );
            SmsMessage[] smses = new SmsMessage[pdus.length];

            for ( int ii = 0; ii < pdus.length; ++ii ) {
                SmsMessage sms = SmsMessage.createFromPdu((byte[])pdus[ii]);
                if ( null != sms ) {
                    String phone = sms.getOriginatingAddress();
                    byte[] body = sms.getUserData();
                    Log.d(Tag, "onReceive(): got " + body.length
                          + " bytes from " + phone );
                }
            }
        }
    }
}

我在谷歌搜索并在这里搜索但是没有发现任何人报告同样的问题,这表明没有人使用sendDataMessage()或者我正在做某事真傻。我希望有人可以指出它。

(我当然使用的是GSM手机。sendDataMessage()在CDMA上根本不起作用。)

谢谢!

0 个答案:

没有答案