2012-12-28 25 views
6

Tôi hiện đang cố phát triển ứng dụng SMS và cho phép người dùng gửi SMS cho nhiều người.Gửi SMS theo lập trình tới nhiều người nhận được Lỗi Chung

Như SMS dài tôi phải sử dụng sendMultipartTextMessage đó là dưới

private void sendSMS(final String phoneNumber, String message) { 
    String SENT = "SMS_SENT"; 
    String DELIVERED = "SMS_DELIVERED"; 

    SmsManager sms = SmsManager.getDefault(); 
    ArrayList<String> parts = sms.divideMessage(message); 
    int messageCount = parts.size(); 

    Log.i("Message Count", "Message Count: " + messageCount); 

    ArrayList<PendingIntent> deliveryIntents = new ArrayList<PendingIntent>(); 
    ArrayList<PendingIntent> sentIntents = new ArrayList<PendingIntent>(); 

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

    for (int j = 0; j < messageCount; j++) { 
     sentIntents.add(sentPI); 
     deliveryIntents.add(deliveredPI); 
    } 

    // ---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; 
      } 
     } 
    }, new IntentFilter(DELIVERED)); 

    sms.sendMultipartTextMessage(phoneNumber, null, parts, sentIntents, deliveryIntents); 
} 

tôi sẽ gặp phải một lỗi chung khi tôi cố gắng để gửi cho nhiều người trong một vòng lặp như thế này và thông điệp chiến thắng' t được gửi đi. Tôi nghi ngờ nó là bởi vì tin nhắn có lẽ là 3-4 phần và hệ thống android không thể gửi tin nhắn kịp thời ngay cả với sự chậm trễ 3000 mili giây.

for (int t = 0; t < array.length; t++) { 
     System.out.println("temp: " + array[t].toString()); 
     try { 
      sendSMS(array[t].toString(), message); 
      Thread.sleep(3000); 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     } 
    } 

EDIT: Mã trên nằm trong AsyncTask được thực hiện bên trong Dịch vụ.

+0

hiển thị logcat của bạn –

+0

Không có lỗi logcat, nó sẽ chỉ hiển thị các Toast cho 'SmsManager.RESULT_ERROR_GENERIC_FAILURE' nói Lỗi Generic hai lần khi tôi cố gắng để gửi nó đến 2 địa chỉ liên lạc. – dythe

+0

Bạn gặp lỗi này trong trình mô phỏng hoặc thiết bị? –

Trả lời

19

IHMO bạn không sử dụng đúng cách. Tôi đang sử dụng một cái khác và nó đang hoạt động. Tôi cố gắng giải thích:

Bạn nên giữ bộ đếm cho tất cả các mục đích đang chờ xử lý vì nếu tin nhắn bạn đang gửi có hai phần, bạn sẽ nhận được hai RESULT_OK (hoặc RESULT_ERROR_ *) và chỉ khi bạn nhận được kết quả cho tất cả các phần bạn nên tiếp tục gửi sms tiếp theo. Tôi không thích ý tưởng chặn luồng ... có lẽ đây là lý do bạn nhận được lỗi lạ.

tôi refactored mã của bạn với cách tiếp cận của tôi:

private int mMessageSentParts; 
private int mMessageSentTotalParts; 
private int mMessageSentCount; 

private void startSendMessages(){ 

    registerBroadCastReceivers(); 

    mMessageSentCount = 0; 
    sendSMS(array[mMessageSentCount].toString(), message); 
} 

private void sendNextMessage(){ 
    if(thereAreSmsToSend()){ 
     sendSMS(array[mMessageSentCount].toString(), message); 
    }else{ 
     Toast.makeText(getBaseContext(), "All SMS have been sent", 
         Toast.LENGTH_SHORT).show(); 
    } 
} 

private boolean thereAreSmsToSend(){ 
    return mMessageSentCount < array.length; 
} 

private void sendSMS(final String phoneNumber, String message) { 
    String SENT = "SMS_SENT"; 
    String DELIVERED = "SMS_DELIVERED"; 

    SmsManager sms = SmsManager.getDefault(); 
    ArrayList<String> parts = sms.divideMessage(message); 
    mMessageSentTotalParts = parts.size(); 

    Log.i("Message Count", "Message Count: " + mMessageSentTotalParts); 

    ArrayList<PendingIntent> deliveryIntents = new ArrayList<PendingIntent>(); 
    ArrayList<PendingIntent> sentIntents = new ArrayList<PendingIntent>(); 

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

    for (int j = 0; j < mMessageSentTotalParts; j++) { 
     sentIntents.add(sentPI); 
     deliveryIntents.add(deliveredPI); 
    } 

    mMessageSentParts = 0; 
    sms.sendMultipartTextMessage(phoneNumber, null, parts, sentIntents, deliveryIntents); 
} 

private void registerBroadCastReceivers(){ 

    registerReceiver(new BroadcastReceiver() { 
     @Override 
     public void onReceive(Context arg0, Intent arg1) { 
      switch (getResultCode()) { 
      case Activity.RESULT_OK: 

       mMessageSentParts++; 
       if (mMessageSentParts == mMessageSentTotalParts) { 
        mMessageSentCount++; 
        sendNextMessage(); 
       } 

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

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

} 
+0

Cách tiếp cận của bạn chỉ gửi tin nhắn đến một người dùng duy nhất? Bởi vì trong trường hợp của tôi 'mảng [t] .toString()' là mảng chuỗi các số khoảng 2 đến 3 người thay vì chỉ 1. – dythe

+1

Nó sẽ gửi tin nhắn đến một người nhận vào thời gian. Tôi giả định rằng mỗi vị trí của mảng của bạn là một số điện thoại duy nhất. – rciovati

+0

Được quản lý để giải quyết, đánh dấu là câu trả lời chính xác. – dythe

2

tôi đã đến cùng một lỗi "Generic thất bại" xảy ra cách sử dụng mã này. Nhưng tôi đã sử dụng mảng [mMessageSentCount] .toString(). Trim(). Sau đó, nó giải quyết vấn đề của tôi & làm việc tốt. Cảm ơn

Các vấn đề liên quan