接收发送到特定端口的短信

时间:2012-09-25 16:29:29

标签: android sms broadcastreceiver android-manifest intentfilter

这是一个经常出现的问题,但我无法找到有关此主题的完整文档。

当使用kannel或其他设备使用默认参数发送时,我已经有一个能够拦截SMS的工作应用程序。我的清单看起来像这样:

<receiver
    android:name=".sms.SMSListener"
    android:enabled="true" >
    <intent-filter>
        <action android:name="android.provider.Telephony.SMS_RECEIVED" />    
    </intent-filter>
</receiver>

它适用于android.provider.Telephony.SMS_RECEIVEDandroid.intent.action.DATA_SMS_RECEIVED

但就我的申请而言,短信不得出现在用户收件箱中。为此,kannel将SMS发送到特定端口。它已经在Blackberry上工作了,所以我猜问题的发送部分已经有效了。 也有可能通过其他方式实现这一目标,我需要实施此解决方案,以便与其他类似项目保持一致。另一个原因是,避免在每个收到的短信中解雇我的BroadcastReceiver(因此需要解析每个收到的短信)。

然而,对于我当前的清单,我没有收到发送到特定端口的SMS(我的接收器根本没有被触发)。经过一些研究,我发现了how to receive text sms to specific port..How to send and receive data SMS messages这些话题。 有人说添加:

<data android:scheme="sms" />
<data android:port="1234" />

足以工作(不幸的是,它对我不起作用)。但是,根据文档(http://developer.android.com/guide/topics/manifest/data-element.html),您需要指定android:scheme,然后指定android:host,以便考虑android:port。据我了解文档,您只需指定android:scheme,而intent-filter应该仍然是functionalal。 但是,只要我指定android:scheme,我的BroadcastReceiver就会停止工作,无论我是否发送带有特定端口的短信:

<receiver
    android:name=".sms.SMSListener"
    android:enabled="true" >
    <intent-filter>
        <action android:name="android.provider.Telephony.SMS_RECEIVED" />    
        <data android:scheme="sms" />
    </intent-filter>
</receiver>

所以我的问题如下:

  1. 是否存在关于android:scheme可以采用哪个值的文档?
  2. 我应该将哪个值用于android:host
  3. 是否有某个应用程序可以收听每个端口的短信,所以我可以确定测试短信是否正确发送(只是仔细检查这部分)?

1 个答案:

答案 0 :(得分:0)

我终于明白了什么是错的:

我正在将我的数据短信发送到为WAP-PUSH消息保留的端口2948。 因此android不会将这些消息广播到我的android.intent.action.DATA_SMS_RECEIVED接收器。使用不同的端口解决了这个问题。

此外,android似乎有8位编码SMS的问题(至少它会在日志中引发警告)。但是我的主要问题已经解决了。