2011-06-13 143 views
1

因此,我试了很长时间才找到一种方法来制作可以在android中发送和接收短信的应用。这工作正常。下面是代码:在android中发送独特的短信和接收looong短信

对于发送:

@SuppressWarnings("deprecation") 
public void sendSMS(String phoneNumber, String message) { 


    String SENT = "SMS_SENT"; 
    String DELIVERED = "SMS_DELIVERED"; 
    int unq = 0; 
    Intent sent = new Intent(SENT); 
    sent.putExtra("unq", unq); 
    Intent delivered = new Intent(DELIVERED); 
    delivered.putExtra("unq", unq); 

    PendingIntent sentPI = PendingIntent.getBroadcast(this, 0, sent, 0); 

    PendingIntent deliveredPI = PendingIntent.getBroadcast(this, 0,delivered, 0); 

    // ---when the SMS has been sent--- 
    registerReceiver(new BroadcastReceiver() { 
     @Override 
     public void onReceive(Context arg0, Intent arg1) { 

      switch (getResultCode()) { 
      case Activity.RESULT_OK: 
       Toast.makeText(getBaseContext(), "SMS sent", 
         Toast.LENGTH_SHORT).show(); 
       smsstatus = "0"; 
       smserror = "noError"; 
       //sendSmsStatus(); 
       break; 
      case SmsManager.RESULT_ERROR_GENERIC_FAILURE: 
       Toast.makeText(getBaseContext(), "Generic failure", 
         Toast.LENGTH_SHORT).show(); 
       setSmsstatus("1"); 
       setSmserror("Generic failure"); 
       sendSmsStatus("Generic failure"); 
       break; 
      case SmsManager.RESULT_ERROR_NO_SERVICE: 
       Toast.makeText(getBaseContext(), "No service", 
         Toast.LENGTH_SHORT).show(); 
       setSmsstatus("2"); 
       setSmserror("No service"); 
       sendSmsStatus("No service"); 
       break; 
      case SmsManager.RESULT_ERROR_NULL_PDU: 
       Toast.makeText(getBaseContext(), "Null PDU", 
         Toast.LENGTH_SHORT).show(); 
       setSmsstatus("3"); 
       setSmserror("Null PDU"); 
       sendSmsStatus("Null PDU"); 
       break; 
      case SmsManager.RESULT_ERROR_RADIO_OFF: 
       Toast.makeText(getBaseContext(), "Radio off", 
         Toast.LENGTH_SHORT).show(); 
       setSmsstatus("4"); 
       setSmserror("Radio off"); 
       sendSmsStatus("Radio off"); 
       break; 
      } 

     } 

    }, new IntentFilter(SENT)); 

    // ---when the SMS has been delivered--- 
    registerReceiver(new BroadcastReceiver() { 
     @Override 
     public void onReceive(Context arg0, Intent arg1) { 

      switch (getResultCode()) { 
      case Activity.RESULT_OK: 
       Toast.makeText(getBaseContext(), "SMS delivered", 
         Toast.LENGTH_SHORT).show(); 

       break; 
      case Activity.RESULT_CANCELED: 
       Toast.makeText(getBaseContext(), "SMS not delivered", 
         Toast.LENGTH_SHORT).show(); 

       break; 
      } 

     } 
    }, new IntentFilter(DELIVERED)); 

    SmsManager sms = SmsManager.getDefault(); 
    sms.sendTextMessage(phoneNumber, null, message, sentPI, deliveredPI); 
} 

用于接收:

public class SmsReceiver extends BroadcastReceiver { 
@SuppressWarnings("deprecation") 
@Override 
public void onReceive(Context context, Intent intent) { 
    // ---get the SMS message passed in--- 

    Bundle bundle = intent.getExtras(); 
    SmsMessage[] msgs = null; 
    String str = ""; 
    Object sms = ""; 
    ArrayList<String> s = new ArrayList<String>(); 
    Manager m = Factory.getInstance().getManager(); 

    if (bundle != null) { 
     // ---retrieve the SMS message received--- 
     Object[] pdus = (Object[]) bundle.get("pdus"); 
     msgs = new SmsMessage[pdus.length]; 
     for (int i = 0; i < msgs.length; i++) { 
      msgs[i] = SmsMessage.createFromPdu((byte[]) pdus[i]); 
      str += " SMS fra " + msgs[i].getOriginatingAddress() + "\n"; 
      str += " Besked: "; 
      str += msgs[i].getMessageBody().toString(); 
      str += "\n"; 
      sms = "SMS = "+msgs[i].getOriginatingAddress()+","+msgs[i].getMessageBody().toString(); 
      s.add(msgs[i].getOriginatingAddress()); 
      s.add(msgs[i].getMessageBody().toString()); 
     } 
     // ---display the new SMS message--- 
     Toast.makeText(context, str, Toast.LENGTH_LONG).show(); 
     Manager.toastIt(context, str);    

     // Send the sms to the server 
     //Connection.send(new Transmit("SmsReceived",s)); 
    } 
} 
} 

这个伟大的工程!

问题出在这里。它是更多钞票来refactore我的代码才达到以下几点:

  1. 对我发送短信的唯一indentifier /标记,这样我可以确保我收到一个状态,其短信。正如你所看到的,我已经试图在我的两个意图上加上额外的东西,也许这是正确的方式,但不仅我现在不是如何检查/接收/提取状态标志,而且标志真的是“独特的“现在。

  2. 很好,我可以尝试短信,但是当它超过160个字符时,它只显示我的前160个字符。我曾看过GTalkSMS如何做,但希望我的代码可以重构一下:)

  3. 最后一个问题是,上述2的混合。我不能发送超过160个字符的短信。我知道我必须使用sendMultipartTextMessage,但我不知道如何。我的想法是,我可以将“字符串消息”除以100来排列数组,但我不知道。

因此,请随意重新构造代码。我期待着看到你的回复! :D 请问你是否需要解释更好或更多代码的任何东西! :)

回答

1

不是Android特定的,但阅读“串联短信”标准。基本上它是多个消息,每个消息指定它们与前一个消息相同,但它作为完全独立的SMS传播。

大多数手机当然都隐藏了这个事实,但是如果您直接收到短信,很可能您需要自己处理 - 发送接收。假设Android使用这个标准,这似乎是一个安全的赌注。

既然它很常见,我相信你可以找到某个人已经写好的图书馆。你问

http://en.wikipedia.org/wiki/Concatenated_SMS

+0

它看起来非常好,谢谢你的答案,但我不知道这是我在找什么。我希望得到一些代码:) – 2011-06-13 20:26:16

+0

够公平的。不过,我不了解Android,所以这就是我所拥有的。 – Robert 2011-06-13 20:39:40

0

一切都在GTalkSMS代码(看来你已经错过了)。 :-)但是我会指出你正确的片段。

为了使用sendMultipartTextMessage()和区分不同的已发送/已递送通知必须先通过SmsManager.divideMessage(message)分裂消息字符串,并创建两个,一个用于发送的通知,一个用于传送通知,PendingIntents的ArrayLists,意图,其中,

PendingIntent.getBroadcast(context, UNIQUE_ID, deliveredIntent, PendingIntent.FLAG_ONE_SHOT)

这保证了andoird将播出一个独特意图,每发送送达:这是重要的组成部分,每天的PendingIntent已经与机管局唯一的请求INT创建通知。您还可以为意图添加一些额外功能,以便稍后告知您通知的是哪种SMS。 代码片段可以在这里找到:sendSMSByPhoneNumber()

确保您SmsReceiver意识到传入意图可以包含多个发送者不止一个短信,但最多不能超过nbfOfpdus不同的发件人。 GTalkSMS接收器肯定会帮助您了解如何实现这一目标。 :)