ver studio registro recibir llamadas leer enviar como almacenamiento android sms

studio - Escuchar los SMS salientes o el buzón enviado en Android



leer sms android studio (4)

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

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

Sé hasta cierto punto que es necesario establecer un observador de contenido en el buzón enviado o en el buzón de salida, pero no sé cómo hacerlo.

¿Cómo puede hacerse esto?


Básicamente, tienes que registrar un observador de contenido ... algo como esto:

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 obtienes el contenido del SMS? Debes usar 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 :)


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ás usando una actividad. Recuerde que necesitará una referencia de contexto para llamar a getContentResolver() desde un servicio o receptor.


Este es mi enfoque para resolver esto

  1. Crear un servicio que llame desde otra actividad
  2. Crea 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. Crea 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. Agregué un método smsChecker () para verificar si el nuevo mensaje es el mismo que el ú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 / sent" si SOLO queremos verificar todos los mensajes enviados, "content: // sms / out" si SOLO queremos verificar todos los mensajes dentro de outbox, y "content" : // sms "si queremos verificar TODOS los mensajes.


Vi lo que va mal. está en la línea:

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

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