2011-06-13 184 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接收器肯定會幫助您瞭解如何實現這一目標。 :)