2011-09-23 67 views
2

在我的應用程序,我需要發送短信,所以我用下面的代碼SmsManager不斷重試發送短信上的HTC Desire

final String SMS_REQUEST_OK = "SMS_REQUEST_OK"; 
String m_sms_message = String.format("sample text"); 
String m_dest_number = "some number"; 

Intent SMSInfo = new Intent(SMS_REQUEST_OK); 
SMSInfo.putExtra("msg", m_sms_message); 
SMSInfo.putExtra("num", m_dest_number); 
PendingIntent sentPI = PendingIntent.getBroadcast(m_context, 0, 
        SMSInfo, PendingIntent.FLAG_CANCEL_CURRENT); 

m_context.registerReceiver(new BroadcastReceiver(){ 
    @Override 
    public void onReceive(Context arg0, Intent arg1) { 
     switch (getResultCode()){ 
      case Activity.RESULT_OK: 
       Toast.makeText(m_context, String.format(
        m_context.getResources().getString(R.string.sms_success), 
        arg1.getExtras().getString("msg"), 
        arg1.getExtras().getString("num")), 
        Toast.LENGTH_LONG).show(); 
       break; 
      default: 
       Toast.makeText(m_context, String.format(
        m_context.getResources().getString(R.string.sms_error), 
        arg1.getExtras().getString("msg"), 
        arg1.getExtras().getString("num")), 
        Toast.LENGTH_LONG).show(); 
       break; 
    } 
} 
}, new IntentFilter(SMS_REQUEST_OK)); 

SmsManager.getDefault().sendTextMessage(
    m_dest_number, 
    null, 
    m_sms_message, 
    sentPI, 
    null); 

我希望它嘗試發送短信一次,然後顯示吐司消息與此操作的結果。如果SMS發送成功,它可以正常工作,但如果不是它會一直重試發送它,判斷很多Toast消息(它發生在HTC Desire(S)上,因此在三星上測試它並不會產生這種行爲 - 帶有錯誤的Toast被顯示一次)。 那麼 - SmsManager應該如何表現以及如何避免它(以便它只嘗試一次發送短信)?

編輯我忘了提 - 它發生,如果getResultCode()返回133404,沒有測試它在其他錯誤

EDIT2this133404是HTC特有的錯誤,這意味着暫時失敗和設備將自動重試,直到最終收到正確的結果碼併發送廣播。但是,在合理的時間內沒有收到SmsManager記錄的廣播。所以問題依然存在 - 是否有辦法阻止這種重試嘗試?

回答

2

只是總結一下我發現的:根據android文檔,sendTextMessage()的預期行爲只是一次嘗試發送消息,然後播放結果。但是,一些HTC設備不斷嘗試發送消息,每次嘗試後都會播放「臨時錯誤」代碼。因此,如果應用程序只檢查結果代碼是否「成功」(因爲android市場上的許多短信應用程序似乎這樣做),它會將消息標記爲未發送並停止收聽(它適合sendTextMessage()函數的預期行爲),這可能導致標記消息未發送,實際上它在稍後的嘗試中被成功發送。

更糟糕的是,可能永遠不會發送文檔化代碼 - 所以,如果您收到HTC「臨時代碼」(133404或133179,可能還有更多),則消息狀態是無法確定的 - 可能會在一段時間後發送,或者可能永遠不會被髮送。因此,在我看來,您只能通過繼續收聽廣播來確定消息狀態,直到您獲得正確的結果代碼(可能永遠不會發送)或者根據廣播傳送進行判斷。

+0

有什麼辦法強制和HTC設備不嘗試和重新發送,但只是失敗優雅? – user123321

+0

我沒找到辦法 – Vladimir

+0

你能否提供一份參考資料或鏈接詳細解釋這個問題? –