2012-12-28 24 views
6

Şu anda bir SMS uygulaması geliştirmeye ve kullanıcının birden çok kişiye SMS göndermesine izin vermeye çalışıyorum. 'SMS olarak Birden çok kişiye programsal olarak SMS gönderme Genel Hata

i böyle bir döngü içinde birden fazla kişiye göndermek için denediğimde genel hatayla karşılaşırsınız

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

altındadır sendMultipartTextMessage kullanmak zorunda uzundur ve mesaj kazandı gönderilmeli. Şüpheleniyorum çünkü mesaj muhtemelen 3-4 parçadır ve android sistem 3000 milisaniye gecikme süresiyle bile mesajı zamanında gönderemez.

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

DÜZENLEME: Yukarıdaki kod bir Hizmet içinde yürütülen AsyncTask'tadır.

+0

logcat'inizi göster –

+0

Herhangi bir kayıt defteri hatası yok, sadece 2 kişi için göndermeye çalıştığımda Generic Error (Genel Hata) diyerek “SmsManager.RESULT_ERROR_GENERIC_FAILURE” ifadesini gösterecektir. – dythe

+0

Bu hatayı emülatörde veya cihazda mı aldınız? –

cevap

19

IHMO doğru yaklaşımı kullanmıyorsunuz. Farklı bir tane kullanıyorum ve çalışıyor. Açıklamaya çalışıyorum:

Tüm bekleyen amaçlar için bir sayaç tutmalısınız, çünkü gönderdiğiniz sms iki bölüme sahipse, iki RESULT_OK (veya RESULT_ERROR_ *) alırsınız ve yalnızca sonuçları tüm bölümler için aldığınızda Sonraki sms göndermeye devam edin. İpliği engelleme fikrini sevmiyorum ... belki de garip hatalar almanın nedeni budur. Ben "Genel başarısızlık" Bu kodu kullanarak oluştu aynı hatayı gelmiş

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

Yaklaşımınız sadece tek bir kullanıcıya mesaj gönderiyor mu? Çünkü benim durumumda 'array [t] .toString()', sadece 1 yerine 2 ila 3 kişilik bir dizi dizisidir. – dythe

+1

Mesajı bir alıcıya zamanında gönderir. Dizininizin her konumunun tek bir telefon numarası olduğunu varsaydım. – rciovati

+0

Doğru cevabı işaretleyerek, onu çözmek için yönetildi. – dythe

2

:

benim yaklaşımla kodunuzu refactored. Ama ben dizisi kullanıyorum [mMessageSentCount] .toString(). Trim(). Sonra onun benim sorun & onun çalışma sorunu çözüldü. Teşekkürler

İlgili konular