用于发送"数据的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上根本不起作用。)
谢谢!