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
- Crear un servicio que llame desde otra actividad
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; }
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 } } }
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.