2012-05-06 59 views
3

我想實現一個應用程序,它可以在特定的端口上接收短信。關於android短信端口

清單代碼:

<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)端口或不上了。我只想接收那些特定於端口的消息。

回答

2

我有類似的問題,只需添加下列檢查條件在開始你的「的onReceive」代碼:

String dataStr = intent.getDataString(); 
if (dataStr.indexOf(":8888") == -1) { 
    return; 
} 
10

對於那些誰仍然不知道爲什麼應用程序接收數據SMS引導到其它端口,而不只是到端口8091.問題在於清單代碼。我見過很多發佈的解決方案,其中大部分都是錯誤的。

所述清單應該是:

<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> 

該方案,主機和端口屬性必須在意向濾波器的僅一個「數據」元素來定義,而不是在單獨的「數據」元素。

而且不從該link,在「數據測試」節它指出
「的主機和端口一起構成URI權威;如果沒有指定主機,端口被忽略」
所以請記住,如果您希望應用程序只接收特定端口的數據SMS,則需要指定主機。

「主機」元素是*(星號)是指定其接受數據短信的所有主機/電話號碼

希望這可以幫助別人(: