2012-06-03 43 views
6

Tôi có một ứng dụng nhắc nhở sẽ gửi SMS để thông báo cho người dùng rằng thời gian lời nhắc của họ đã qua. Điều này hoạt động tốt. Tuy nhiên, tôi đã thử nghiệm những gì sẽ xảy ra khi điện thoại đã ngủ và bỏ lỡ một lời nhắc nhở.Android - xác định lý do gửi SMS không thành công

Tôi đang sử dụng AlarmManager để thiết lập báo thức tương ứng với thời gian nhắc nhở. Đăng nhập của tôi cho thấy báo thức đã tắt khi điện thoại khởi động lại và một nỗ lực để gửi một tin nhắn SMS xảy ra, nhưng tin nhắn SMS không bao giờ nhận được.

Vì vậy, câu hỏi đặt ra là có cách nào để gỡ lỗi vì sao SMS không được gửi không?

mã hiện tại của tôi thiết lập một ContentObserver khi một sự kiện báo động xảy ra:

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

MessageSentListener được thông báo rằng một số sự kiện SMS đã xảy ra:

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

Nhưng điều này có thể được gây ra bởi sự kiện SMS không liên quan đến ứng dụng của tôi. Dù sao, nó không thực sự làm cho tôi gần gũi hơn với một giải pháp - Tôi muốn biết những gì đã đi sai khi không có gì xảy ra!

Trong trường hợp một tin nhắn SMS báo động không được gửi, tôi sẽ có thể hoặc là gửi lại hoặc sử dụng một số phương pháp thông báo khác như email, vv

Trả lời

5

Bạn sẽ cần phải thu phát sóng và đang chờ giải ý định để có được thông báo về thất bại tin nhắn.

Dưới đoạn mã sẽ giúp bạn

//---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

Cảm ơn - Tôi sẽ cố gắng mà ra. Tôi giả sử tôi sẽ phải hủy đăng ký người nhận trong các phương thức onReceive(). – barry

+0

Điều đó dường như hoạt động. Một vài câu hỏi mặc dù - 1 - nó xuất hiện tôi không cần phải unregister người nhận (họ không đăng nhập bất cứ điều gì khi tin nhắn SMS được gửi tiếp nhận được vv). Tại sao điều này? 2 - làm sao Android biết được SMS đã được gửi? Có một số chức năng SMS cấp thấp ở nơi làm việc ở đó không? – barry

+0

Tôi có thể hủy đăng ký chương trình phát sóng ở đâu –

Các vấn đề liên quan