2012-08-06 185 views
5

我正在開發執行操作的應用程序:短信隊列處理失敗的短信

  • 接收SMS
  • 發送短信
  • 做一些計算任務發件人。

SMS可能無法發送。任何人都可以告訴我如何管理髮送失敗的SMS消息隊列,並在一段時間後繼續重試發送它們。

我已經看到了代碼,但不知道如何處理SMS隊列並重新發送它們。

這裏是代碼:

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

那是什麼你需要幫忙嗎?您對PendingIntent的使用對我來說看起來是正確的。 – wojciii 2012-08-06 11:10:28

+1

嘿wojci我的代碼是好的,但現在我正在想辦法進一步推進,有可能是短信發送給發件人,因爲用戶沒有信用在那裏帳戶,所以我們管理一個隊列,並檢查一段時間後的隊列和重試發送消息。 thanx – Fawad 2012-08-06 11:54:51

回答

1

我不知道如果我理解正確的問題,但據我來說,這似乎是一個簡單的解決方案:當上面的任何失敗的發生

,你可以將該號碼插入列表中,並在指定的時間限制後檢查列表。如果列表中出現任何號碼,則發送消息給該號碼。發送味精後,你應該從列表中刪除該項目

編輯:

代碼 -

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

      } 
      } 
     } 

     }; 

而且在主要活動中,直寫

new checkList().execute(); 
+0

thanx for reply你理解我的問題是正確的,但如何及時檢查列表,請幫助Code。 – Fawad 2012-08-06 11:49:11

+1

但是兄弟我想每隔一小時查看一下列表,直到消息成功發送爲止。 – Fawad 2012-08-06 12:08:54

+0

U可以在代碼中的「Thread.sleep(value)」中放置任何值...值應該以毫秒爲單位。 – 2012-08-06 12:10:52

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

兄弟檢查,我做錯了什麼? – Fawad 2012-08-06 13:37:10

+0

見DonCroco在這一環節回答我建議ü... +的AsyncTask應該在MainActivity類別的底部.. – 2012-08-07 04:50:34

+0

兄弟ü可以修改我的代碼是什麼我想要實現拜託,我完全符合AyncTask搞砸:(感謝名單 – Fawad 2012-08-07 05:37:13