我希望实现一个在特定端口上接收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
)端口上的所有短信。我只希望收到那些特定于端口的消息。
答案 0 :(得分:11)
对于那些仍然想知道为什么应用程序正在接收指向其他端口而不仅仅是端口8091的数据SMS的人。问题出在Manifest代码中。我发现了很多已发布的解决方案,其中大多数都是错误的。
清单应该是:
<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>
方案,主机和端口属性必须只在一个&#34;数据&#34;中定义。意图过滤器的元素,而不是单独的&#34;数据&#34;元素。
同样不是来自link,在&#34;数据测试&#34;它说明了
&#34;主机和端口一起构成URI权限;如果未指定主机,则忽略该端口。&#34;
因此,请记住,如果您希望应用仅接收特定端口的数据短信,则需要指定主机。
&#34;主持人&#34; element is *(星号)用于指定它接受来自所有主机/电话号码的数据短信
希望这有助于某人(:
答案 1 :(得分:2)
我有类似的问题,只需在'onReceive'代码的开头添加以下检查条件:
String dataStr = intent.getDataString();
if (dataStr.indexOf(":8888" ) == -1) {
return;
}