2010-10-23 169 views
3

我想通过Android中的短信发送一些数据(不是多媒体)。这可以做到吗?我只想从一部电话向另一部电话发送非常少量的数据,如XML或其他内容。Android:如何通过短信发送和接收数据

+0

XML ISN对短信的有限字符数非常有效地使用,但这并不会真正影响您的问题。 – BudgieInWA 2010-10-23 22:27:31

回答

3

正确的方法是使用SmsManager类中的sendDataMessage。 这里有一个小码(SMSSender):

SmsManager smsMgr = SmsManager.getDefault(); 
smsMgr.sendDataMessage(phoneNumber, null, 
      (short) myApplicationPort, messageString.getBytes(), sentIntent, deliveryIntent); 

这里还有一个小码(SMSReceiver):

Bundle bundle = intent.getExtras(); 
    if (bundle != null) { 
     Object[] pdusObj = (Object[]) bundle.get("pdus"); 
     SmsMessage[] messages = new SmsMessage[pdusObj.length]; 

     // getting SMS information from PDU 
     for (int i = 0; i < pdusObj.length; i++) { 
      messages[i] = SmsMessage.createFromPdu((byte[]) pdusObj[i]); 
     } 

     for (SmsMessage currentMessage : messages) { 
      if (!currentMessage.isStatusReportMessage()) { 

       String messageBody = currentMessage.getDisplayMessageBody(); 

        byte[] messageByteArray = currentMessage.getPdu(); 

        // skipping PDU header, keeping only message body 
        int x = 1 + messageByteArray[0] + 19 + 7; 

// I'm not sure about this last line, as I'm not converting the bytes back to string, so test it out 
        String realMessage = new String(messageByteArray, x, messageByteArray.length-x); 

这里是你应该添加到您的AndroidManifest.xml什么:

<receiver android:name=".SMSReceiver"> 
    <intent-filter> 
    <action android:name="android.intent.action.DATA_SMS_RECEIVED" /> 
    <data android:scheme="sms" /> 
    <data android:host="localhost" /> 
    <data android:port="12345" /><!-- this number should be the same as the `myApplicationPort` from above!!! --> 
    </intent-filter> 
</receiver> 
+0

谢谢Viktor,看起来不错。但是,这会导致消息的接收者显示一个弹出窗口,询问它想要处理消息的应用程序,还是在后台默默接收? – 2011-06-16 02:26:47

+0

它默默使用,意味着只有一个应用程序应该侦听一个端口上的消息。 – 2012-12-23 14:45:08

1

据我了解你的问题,我会说你可以发送任何类型的文本数据,如XML,JSON字符串或任何通过短信。例如,您可以通过特定的哈希来识别您的数据消息,这些哈希可能是内容的一部分。接收器应该正在监听SMS_RECEIVED意图。

<intent-filter> 
    <action android:name="android.provider.Telephony.SMS_RECEIVED" /> 
</intent-filter> 

这种方式,你可以抓住的数据,之后从消息存储库中删除的消息,以便它不会在谈话中显示出来。