2012-06-03 23 views
6

我有一個提醒應用程序,它會發送短信來通知用戶他們的提醒時間已過。這很好。但是,我一直在測試手機在睡着時錯過提醒的情況。Android - 確定短信發送失敗的原因

我使用AlarmManager來設置警報以符合提醒時間。我的日誌記錄顯示,當手機重新啓動並嘗試發送短信時,鬧鐘響起,但SMS從未收到。

所以問題是,有沒有辦法調試爲什麼不發送短信?

private void registerToListenForSentSMS() 
{ 
    MessageSentListener smsObeserver = new MessageSentListener(new Handler()); 
    ContentResolver contentResolver = TheEveryOtherAlarmAppApplication.getAppContext().getContentResolver(); 
    contentResolver.registerContentObserver(Uri.parse("content://sms"), true, smsObeserver); 
} 

MessageSentListener得到通知一些短信事件發生:

public class MessageSentListener extends ContentObserver 
{ 

public MessageSentListener(Handler handler) 
{ 
    super(handler); 
} 

@Override 
public void onChange(boolean selfChange) 
{ 
    super.onChange(selfChange); 

    Log.d(Constants.ALARM_APP_LOG_TAG, "Something happend"); 
    ContentResolver contentResolver = AlarmAppApplication.getAppContext().getContentResolver(); 

    contentResolver.unregisterContentObserver(this); 
} 
} 

但是這可以通過短信事件引起的,當發生報警事件時

我當前的代碼設置一個ContentObserver與我的應用無關。無論如何,它並沒有真正讓我接近一個解決方案 - 我想知道什麼時候出錯沒有什麼發生!

在事件的報警短信沒有發送,我就能夠重新發送任何或者使用一些其他的通知方法,如電子郵件等

回答

5

您將需要廣播接收器和正在申請的意圖收到通知失敗短信。

下面的代碼片段將幫助您

//---sends an SMS message to another device--- 
    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 context, Intent arg1) { 
       switch (getResultCode()) 
       { 
        case Activity.RESULT_OK: 
         Toast.makeText(context, "SMS sent", 
           Toast.LENGTH_SHORT).show(); 
         break; 
        case SmsManager.RESULT_ERROR_GENERIC_FAILURE: 
         Toast.makeText(context, "Generic failure", 
           Toast.LENGTH_SHORT).show(); 
         break; 
        case SmsManager.RESULT_ERROR_NO_SERVICE: 
         Toast.makeText(context, "No service", 
           Toast.LENGTH_SHORT).show(); 
         break; 
        case SmsManager.RESULT_ERROR_NULL_PDU: 
         Toast.makeText(context, "Null PDU", 
           Toast.LENGTH_SHORT).show(); 
         break; 
        case SmsManager.RESULT_ERROR_RADIO_OFF: 
         Toast.makeText(context, "Radio off", 
           Toast.LENGTH_SHORT).show(); 
         break; 
       } 
      } 
     }, new IntentFilter(SENT)); 

     //---when the SMS has been delivered--- 
     registerReceiver(new BroadcastReceiver(){ 
      @Override 
      public void onReceive(Context context, Intent arg1) { 
       switch (getResultCode()) 
       { 
        case Activity.RESULT_OK: 
         Toast.makeText(context, "SMS delivered", 
           Toast.LENGTH_SHORT).show(); 
         break; 
        case Activity.RESULT_CANCELED: 
         Toast.makeText(context, "SMS not delivered", 
           Toast.LENGTH_SHORT).show(); 
         break;       
       } 
      } 
     }, new IntentFilter(DELIVERED));   

     SmsManager sms = SmsManager.getDefault(); 
     sms.sendTextMessage(phoneNumber, null, message, sentPI, deliveredPI); 
+0

謝謝 - 我會嘗試了這一點。我想我必須在onReceive()方法中取消註冊接收者。 – barry

+0

這似乎工作。有幾個問題雖然 - 1 - 看起來我不需要註銷接收者(當接收到更多短信時,他們不會記錄任何內容)。爲什麼是這樣? 2 - Android如何知道短信已發送?那裏有一些低級SMS功能嗎? – barry

+0

我可以在哪裏取消註冊廣播 –