Android: determinar por qué no se pudo enviar SMS
Tengo una aplicación de recordatorio que enviará un SMS para notificar al usuario que su tiempo de recordatorio ha pasado. Esto funciona bien. Sin embargo, he estado probando lo que sucede cuando el teléfono ha estado dormido y se perdió un recordatorio.
Estoy usando AlarmManager
para configurar alarmas que correspondan a los tiempos de recordatorio. Mi registro muestra que la alarma se apagó cuando se reinicia el teléfono y se produce un intento de enviar un SMS, pero el SMS no se recibe nunca.
- SMS recibidos en mi aplicación de SMS y en Hangouts, aunque llamo a abortBroadcast ()
- Mover un mensaje a la bandeja de entrada desde la base de datos
- Cómo enviar caracteres no impresos a través de SMS
- Sms de prueba de Android del emulador
- Android: Unicode / Charset problemas al enviar un SMS (sendTextMessage)
Así que la pregunta es, ¿hay una manera de depurar por qué un SMS no se envía?
Mi código actual configura un ContentObserver cuando se produce un suceso 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 notifica que ocurrió algún suceso de SMS:
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 causado por eventos SMS no relacionados con mi aplicación. De todos modos, realmente no me acercan a una solución – me gustaría saber lo que salió mal cuando no pasa nada !
En caso de que no se envíe un SMS de alarma, podría volver a enviar o utilizar otro método de notificación, como correo electrónico, etc.
- Obtener número de teléfono para varios destinatarios en android
- Enviar SMS a través de la intención de múltiples números de teléfono
- Obtener mensajes SMS desde la tarjeta SIM
- Intención del informe de entrega de mensajes de Android SMS
- enviar SMS Intent en Android
- Detectar qué tarjeta SIM ha recibido el mensaje
- ¿Cómo enviar un mensaje SMS en un dispositivo Android en segundo plano?
- Receptor de radiodifusión dentro de un servicio
Necesitará el receptor de la emisión y la intención pendiente de recibir notificación sobre los sms fallidos.
A continuación, el fragmento de código le ayudará
//---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);
- Reembolso de facturación de Android en la aplicación
- Implementación de SIP en la plataforma android 2.1