2015-06-02 62 views
1

我想以編程方式發送短信,但在某些情況下,它不工作。Android通過programetically發送短信

如果我打電話是這樣的 - sendSMS("+918444380502", "BAL");短信發送成功沒有問題,但如果我想發送像這樣 - sendSMS("+918444380502", "El teléfono no está registrado o ligado a un usuario, favor de registrarlo");它不發送任何線索!

發送短信代碼如下 -

//---sends an SMS message to another device--- 
public void sendSMS(String phoneNumber, String message) 
{ 
    String SENT = "SMS_SENT"; 
    String DELIVERED = "SMS_DELIVERED"; 

    PendingIntent sentPI = PendingIntent.getBroadcast(this, 0, 
      new Intent(SENT), 0); 

    PendingIntent deliveredPI = PendingIntent.getBroadcast(this, 0, 
      new Intent(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(); 
        break; 
       case SmsManager.RESULT_ERROR_GENERIC_FAILURE: 
        Toast.makeText(getBaseContext(), "Generic failure", 
          Toast.LENGTH_SHORT).show(); 
        break; 
       case SmsManager.RESULT_ERROR_NO_SERVICE: 
        Toast.makeText(getBaseContext(), "No service", 
          Toast.LENGTH_SHORT).show(); 
        break; 
       case SmsManager.RESULT_ERROR_NULL_PDU: 
        Toast.makeText(getBaseContext(), "Null PDU", 
          Toast.LENGTH_SHORT).show(); 
        break; 
       case SmsManager.RESULT_ERROR_RADIO_OFF: 
        Toast.makeText(getBaseContext(), "Radio off", 
          Toast.LENGTH_SHORT).show(); 
        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; 
      } 
      stopSelf(); 
     } 
    }, new IntentFilter(DELIVERED)); 

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

你得到任何異常?您是否研究過有關字符串編碼的文檔以通過它獲取多字編碼?因爲你在第二短信中使用特殊字符。 –

+0

爲unicode短信,最多70個字符在一條消息,或使用sendMultipartTextMessage –

回答

0

的代碼工作對我來說是這樣感謝麥克中號 -

private void sendSMS(String number, String msg) 
{ 
    SmsManager sm = SmsManager.getDefault(); 
    ArrayList<String> parts = sm.divideMessage(msg); 

    Intent iSent = new Intent(ACTION_SMS_SENT); 
    PendingIntent piSent = PendingIntent.getBroadcast(this, 0, iSent, 0); 
    Intent iDel = new Intent(ACTION_SMS_DELIVERED); 
    PendingIntent piDel = PendingIntent.getBroadcast(this, 0, iDel, 0); 

    if (parts.size() == 1) 
    { 
     msg = parts.get(0); 
     sm.sendTextMessage(number, null, msg, piSent, piDel); 
    } 
    else 
    { 
     ArrayList<PendingIntent> sentPis = new ArrayList<PendingIntent>(); 
     ArrayList<PendingIntent> delPis = new ArrayList<PendingIntent>(); 

     int ct = parts.size(); 
     for (int i = 0; i < ct; i++) 
     { 
      sentPis.add(i, piSent); 
      delPis.add(i, piDel); 
     } 

     sm.sendMultipartTextMessage(number, null, parts, sentPis, delPis); 
     stopSelf(); 
    } 
} 

public class SmsReceiver extends BroadcastReceiver 
{ 
    @Override 
    public void onReceive(Context context, Intent intent) 
    { 
     String action = intent.getAction(); 

     if (action.equals(ACTION_SMS_SENT)) 
     { 
      switch (getResultCode()) 
      { 
       case Activity.RESULT_OK: 
        Toast.makeText(getBaseContext(), "SMS sent", 
          Toast.LENGTH_SHORT).show(); 
        break; 
       case SmsManager.RESULT_ERROR_GENERIC_FAILURE: 
        Toast.makeText(getBaseContext(), "Generic failure", 
          Toast.LENGTH_SHORT).show(); 
        break; 
       case SmsManager.RESULT_ERROR_NO_SERVICE: 
        Toast.makeText(getBaseContext(), "No service", 
          Toast.LENGTH_SHORT).show(); 
        break; 
       case SmsManager.RESULT_ERROR_NULL_PDU: 
        Toast.makeText(getBaseContext(), "Null PDU", 
          Toast.LENGTH_SHORT).show(); 
        break; 
       case SmsManager.RESULT_ERROR_RADIO_OFF: 
        Toast.makeText(getBaseContext(), "Radio off", 
          Toast.LENGTH_SHORT).show(); 
        break; 
      } 
     } 
     else if (action.equals(ACTION_SMS_DELIVERED)) 
     { 
      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; 
      } 
     } 
    } 
} 
+0

我忘了提及(我應該在那篇文章上留言),該方法是非常通用的,並且會簡單地爲每個成功的消息部分廣播發送/傳遞的操作。如果您希望將廣播中的任何信息捆綁在一起,例如當前的零件號碼,零件總數等等,將在Receiver中處理,您可能需要更改'getBroadcast'中的'requestCode'和/或'flags'參數()'調用,這取決於你的要求。 –

+1

任何方式它滿足我的要求我已upvoted你 – Anirban

1

既然你不能使用Unicode字符發送短信,請嘗試使用sendMultipartTextMessage代替。

SmsManager sms = SmsManager.getDefault(); 
ArrayList<String> textMsgs = sms.divideMessage(message); 
sms.sendMultipartTextMessage (phoneNumber, null, textMsgs, sentPI, deliveredPI); 
+0

這是給編譯器錯誤.. – Anirban

+0

你得到什麼錯誤? –

+1

這是正確的,除了期待PendingIntents和消息部分的ArrayLists。 [這是一個例子。](http://stackoverflow.com/questions/22890415/android-sms-getting-the-response-error-notification-if-the-message-has-been-deli/22902900#22902900) –