2012-08-06 19 views
5

Zajmuję się tworzeniem aplikacji, które wykonują działania na:SMS kolejka Handling za niewykonanie SMS

  • odbierania SMS
  • Wysyłanie SMS
  • Wykonanie pewnych obliczeniowej zadanie do nadawcy.

Czy to możliwe, że wiadomość SMS nie została wysłana. Czy ktoś może mi powiedzieć, jak zarządzać kolejką nie wysłanych wiadomości SMS i nadal próbować wysłać je po pewnym czasie.

Widziałem kod, ale nie wiem, jak obsługiwać kolejkę SMS i wysłać je ponownie.

Oto kod:

private 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)); 
    SmsManager sms = SmsManager.getDefault(); 
    sms.sendTextMessage(phoneNumber, null, message, sentPI, deliveredPI); 
} 
+0

Co to jest potrzebujesz pomocy? Twoje użycie PendingIntent wygląda dla mnie poprawnie. – wojciii

+1

Hej wojci mój kod jest w porządku, ale teraz znajduję sposób, aby przejść dalej, możliwe jest, że sms nie wysłał do Nadawcy, ponieważ użytkownik nie ma kredytu tam konto, więc zarządzamy kolejką i sprawdzić kolejkę po pewnym odstępie czasu i restry, aby wysłać wiadomość. thanx – Fawad

Odpowiedz

1

Nie jestem pewien, czy zrozumiał swoje pytanie poprawnie, ale według mnie, to wydaje się prostsze rozwiązanie:

przypadku wystąpienia któregokolwiek z powyższych awarii, ty można wstawić ten numer na listę i sprawdzić listę po określonym czasie. Jeśli na liście pojawi się jakaś liczba, wyślij Msg na ten numer. Po wysłaniu wiad, należy usunąć ten element z listy

EDIT:

Code

class checkList extends AsyncTask<String, Void, Void> { 
     public Void doInBackground(String... p) { 
      while (true) { 

         //Check List Value Here 

      try { 
      Thread.sleep(1000); 
      } catch (InterruptedException ie) { 
      ie.printStackTrace(); 
      Log.e("Sleep", "Error: " + ie.toString()); 

      } 
      } 
     } 

     }; 

A w głównej działalności, zapisem

new checkList().execute(); 
+0

thanx za odpowiedź u poprawnie rozumiem moje pytanie, ale jak szybko sprawdzić listę, proszę pomóż z Code. – Fawad

+1

ale bro chcę sprawdzić listę co godzinę, dopóki wiadomość nie zostanie pomyślnie przesłana jest to możliwe? – Fawad

+0

U można umieścić dowolną wartość w "Thread.sleep (wartość)" w kodzie ... wartość powinna być w milisekundach. –

0
 PendingIntent sentPI = PendingIntent.getBroadcast(this, 0, 
      new Intent(SENT), 0); 
     SmsManager sms = SmsManager.getDefault(); 
     sms.sendTextMessage(phone_nr, null,"dummy text" , sentPI, null); 

      class checkList extends AsyncTask<String, Void, Void> { 
     public Void doInBackground(String... p) { 
      while (true) { 
        //failed msg send Again 
       sms.sendTextMessage(phone_nr, null,"message Sended" , sentPI, null); 

      try { 
      Thread.sleep(1000); 
      } catch (InterruptedException ie) { 
      ie.printStackTrace(); 
      Log.e("Sleep", "Error: " + ie.toString()); 

      } 
      } 
     } 

     }; 

    //---when the SMS has been sent--- 
    registerReceiver(new BroadcastReceiver(){ 
     @Override 
     public void onReceive(Context arg0, Intent arg1) { 
      switch (getResultCode()) 
      { 
       case Activity.RESULT_OK: 
          //if failed msg sended cancel the AsyncTask 
          new checkList().cancel(); 
        break; 
       case SmsManager.RESULT_ERROR_GENERIC_FAILURE: 
        new checkList().execute(); 
        break; 
       case SmsManager.RESULT_ERROR_NO_SERVICE: 
        new checkList().execute(); 
        break; 
       case SmsManager.RESULT_ERROR_NULL_PDU: 
        new checkList().execute(); 
        break; 
       case SmsManager.RESULT_ERROR_RADIO_OFF: 
        new checkList().execute(); 
        break; 
      } 
     } 
    }, new IntentFilter(SENT)); 
+0

Bracie, czy robię coś złego? – Fawad

+0

Zobacz odpowiedź DonCroco w tym linku zasugerowałem, że ... + AsyncTask powinien znajdować się na samym dole klasy MainActivity .. –

+0

bro możesz zmodyfikować mój kod do tego, co chcę osiągnąć. Jestem całkowicie obeznany z AyncTask :(thanx – Fawad