Escucha SMS salientes o caja enviada en Android

Estoy desarrollando una aplicación que almacenará todos los sms entrantes y salientes en un archivo de texto en tarjeta SD.

Puedo escuchar los mensajes entrantes usando el receptor de la difusión. Me resulta muy difícil escuchar SMS salientes.

Sé que hasta cierto punto que un observador de contenido en la caja enviada o bandeja de salida debe ser establecido, pero no sé cómo hacerlo.

¿Cómo se puede hacer esto?

Básicamente, tienes que registrar un observador de contenido … algo así:

ContentResolver contentResolver = context.getContentResolver(); contentResolver.registerContentObserver(Uri.parse("content://sms/out"),true, yourObserver); 

yourObserver es un objeto ( new YourObserver(new Handler()) ) que podría verse así:

 class YourObserver extends ContentObserver { public YourObserver(Handler handler) { super(handler); } @Override public void onChange(boolean selfChange) { super.onChange(selfChange); // save the message to the SD card here } } 

Entonces, ¿cómo exactamente obtener el contenido del SMS? Debe utilizar un Cursor :

 // save the message to the SD card here Uri uriSMSURI = Uri.parse("content://sms/out"); Cursor cur = this.getContentResolver().query(uriSMSURI, null, null, null, null); // this will make it point to the first record, which is the last SMS sent cur.moveToNext(); String content = cur.getString(cur.getColumnIndex("body")); // use cur.getColumnNames() to get a list of all available columns... // each field that compounds a SMS is represented by a column (phone number, status, etc.) // then just save all data you want to the SDcard :) 

Este es mi enfoque para resolver esto

  1. Crear un servicio que llamó desde otra actividad
  2. Crear un observador de contenido dentro de él

      @Override public int onStartCommand(Intent intent, int flag, int startId) { MyObserver myObserver = new MyObserver(new Handler()); ContentResolver contentResolver = this.getApplicationContext().getContentResolver(); contentResolver.registerContentObserver(Uri.parse("content://sms/sent"), true, myObserver); return START_STICKY; } 
  3. Crear la clase de observador

     class MyObserver extends ContentObserver { public MyObserver(Handler handler) { super(handler); } @Override public void onChange(boolean selfChange) { super.onChange(selfChange); Uri uriSMSURI = Uri.parse("content://sms/sent"); Cursor cur = getContentResolver().query(uriSMSURI, null, null, null, null); cur.moveToNext(); String content = cur.getString(cur.getColumnIndex("body")); String smsNumber = cur.getString(cur.getColumnIndex("address")); if (smsNumber == null || smsNumber.length() <= 0) { smsNumber = "Unknown"; } cur.close(); if(smsChecker( "OutgoingSMS to " + smsNumber + ": " + content)) { //save data into database/sd card here } } } 
  4. He añadido un método smsChecker () para comprobar si el nuevo mensaje es igual al último mensaje

     public boolean smsChecker(String sms) { boolean flagSMS = true; if (sms.equals(lastSMS)) { flagSMS = false; } else { lastSMS = sms; } //if flagSMS = true, those 2 messages are different return flagSMS; } 

Si no me equivoco, utilizamos "content: // sms / send" si SOLAMENTE queremos comprobar todos los mensajes enviados, "content: // sms / out" si SOLAMENTE queremos comprobar todos los mensajes dentro de outbox y "content : // sms "si queremos comprobar TODOS los mensajes.

Esta es mi versión, que se ha verificado en Android 6.0+

 class smsObserver extends ContentObserver { private String lastSmsId; public smsObserver(Handler handler) { super(handler); } @Override public void onChange(boolean selfChange) { super.onChange(selfChange); Uri uriSMSURI = Uri.parse("content://sms/sent"); Cursor cur = getContentResolver().query(uriSMSURI, null, null, null, null); cur.moveToNext(); String id = cur.getString(cur.getColumnIndex("_id")); if (smsChecker(id)) { String address = cur.getString(cur.getColumnIndex("address")); // Optional: Check for a specific sender if (address.equals(phoneNumber)) { String message = cur.getString(cur.getColumnIndex("body")); // Use message content for desired functionality } } } // Prevent duplicate results without overlooking legitimate duplicates public boolean smsChecker(String smsId) { boolean flagSMS = true; if (smsId.equals(lastSmsId)) { flagSMS = false; } else { lastSmsId = smsId; } return flagSMS; } } 

Coloque este código donde el observador debe estar habilitado

 ContentResolver contentResolver = getContentResolver(); contentResolver.registerContentObserver(Uri.parse("content://sms"), true, new smsObserver(new Handler())); 

Esto supone que está utilizando una actividad. Recuerde que necesitará una referencia Context para llamar a getContentResolver() desde dentro de un servicio o receptor.

Vi lo que pasa. Está en la línea

  contentResolver.registerContentObserver(Uri.parse("content://sms/sent"), true, _myObserver); 

Debes eliminar '/ enviado' y simplemente escribir 'content: // sms' ya está especificado en el ContentObserver para ver los sms enviados.

  • Volver a Actividad después de completar la acción en Android?
  • Menú contextual de Android SMS
  • Sms de prueba de Android del emulador
  • SmsManager SendDataMessage en Android
  • Cómo abrir un SMS específico en android
  • Cómo enviar SMS con Delphi XE5 en Android
  • Mantener un registro de los SMS enviados en Android
  • Android: cómo obtener el número de teléfono de un SMS entrante?
  • Podría un emulador enviar un SMS a sí mismo
  • Enviar y recibir SMS dentro de mi propia aplicación, no en la aplicación nativa de mensajes en android usando la API nativa de SMS
  • Selecciona los primeros SMS en la bandeja de entrada de la base de datos de Android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.