2012-06-03 15 views
6

Tengo una aplicación de recordatorio que enviará un SMS para notificar al usuario que ha pasado su tiempo de recordatorio. Esto funciona bien Sin embargo, he estado probando qué sucede cuando el teléfono ha estado dormido y se ha perdido un recordatorio.Android: determinar por qué el envío de SMS falló

estoy usando AlarmManager a establecer alarmas que corresponden a los tiempos de recordatorio. Mi registro muestra que la alarma se activó cuando el teléfono se reinicia y se produce un intento de enviar un SMS, pero el SMS nunca se recibe.

Entonces, la pregunta es, ¿hay alguna forma de solucionar el problema por el que no se envía un mensaje de texto?

Mi código actual establece un ContentObserver cuando un evento de alarma:

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

MessageSentListener se notificó que algún evento SMS pasó:

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

Pero esto podría ser causada por eventos SMS no relacionado con mi aplicación. De todos modos, realmente no me acerca a una solución. Me gustaría saber qué salió mal cuando no pasa nada..

En el caso de que un SMS de alarma no se envía, me gustaría ser capaz de enviar o bien utilizar algún otro método de notificación como el correo electrónico, etc.

Respuesta

5

Tendrá receptor de radiodifusión y la intención en espera para ser notificado sobre el fallido SMS.

A continuación fragmento de código le ayudará a

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

Gracias - Voy a tratar de eso. Supongo que tendré que anular el registro de los receptores en los métodos onReceive(). – barry

+0

Eso parece funcionar. Sin embargo, un par de preguntas - 1 - parece que no necesito anular el registro de los receptores (no registran nada cuando se envían más SMS, etc.). ¿Por qué es esto? 2 - ¿Cómo sabe Android que se ha entregado un SMS? ¿Hay alguna funcionalidad de SMS de bajo nivel funcionando allí? – barry

+0

Donde no puedo registrar la transmisión –

Cuestiones relacionadas