El observador SMS enviado se ejecuta 3 veces

He definido el siguiente servicio con un observador de los mensajes enviados. El problema es que al enviar un mensaje, siento que se llama 3 veces el método onChange de contentobserver. ¿Alguien sabe decirme por qué?

Gracias

public class DSMSService extends Service { private static final String CONTENT_SMS = "content://sms"; private class MyContentObserver extends ContentObserver { ContentValues values = new ContentValues(); int threadId; public MyContentObserver() { super(null); } @Override public void onChange(boolean selfChange) { super.onChange(selfChange); Log.v(TAG, "****************************** SMS change detected *************************************"); Log.v(TAG, "Notification on SMS observer"); // save the message to the SD card here Uri uriSMSURI = Uri.parse("content://sms"); Cursor cur = getBaseContext().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")); Log.v(TAG, "content: " + content); } @Override public boolean deliverSelfNotifications() { return false; } } @Override public IBinder onBind(Intent intent) { return null; } @Override public void onCreate() { Log.v(TAG, "starting........"); MyContentObserver contentObserver = new MyContentObserver(); ContentResolver contentResolver = getBaseContext().getContentResolver(); contentResolver.registerContentObserver(Uri.parse("content://sms"),true, contentObserver); DAO = new DAOaBlackList(getBaseContext()); } @Override public void onDestroy() { Log.d(TAG, "stopping........"); } @Override public int onStartCommand(Intent intent, int flags, int startId) { Log.v(TAG, "Received start id " + startId + ": " + intent); // We want this service to continue running until it is explicitly // stopped, so return sticky. return START_STICKY; } @Override public void onStart(Intent intent, int startid) { Log.v(TAG, "onStart........"); } } 

Lo que quieres hacer es comprobar el _id del último elemento en el content://sms/sent send uri inside onChange. Debes almacenar el _id anterior (quizás en una variable global estática) y compararlo con el _id del último elemento ( cursor.moveToLast() ) del cursor después de consultar el content://sms/sent . Si el _id es el mismo, puede optar por ignorar la llamada a onChange. Estas múltiples llamadas a onChange creo que se debe a que los sms se están moviendo de carpeta a carpeta durante el envío – caja de salida, elementos enviados, alguna otra "carpeta invisible" (que no podemos saber exactamente qué, ya que esta característica REALMENTE REALMENTE necesita documentación). Como no puedes escuchar un Uri más específico que el content://sms/sent tendrás que implementar esta comprobación para _id cada vez que quieras detectar un sms que está siendo enviado.

Si el _id anterior es diferente al de su variable global estática, entonces usted tiene un sms que está siendo enviado.

Ha mantenido el observador para la base de datos de SMS a través de URI. Por lo que siempre que se envía el mensaje se actualiza la base de datos y se está actualizando 3 de la columna de esa tabla. Por lo que notificará al observador para cada uno de ellos. Por lo que se está solicitando tantas veces como los datos de la tabla se actualizan.

  • Android: obtenga la hora de la fecha de la marca de tiempo de SMS en milisegundos
  • Android: Leer / Enviar mensajes de texto en Ubuntu?
  • Cómo actualizar el hilo de sms después de insertar un borrador en "content: // sms / draft"
  • Android: cómo marcar sms como leído en onReceive
  • ¿Cómo enviar SMS usando Twilio en mi aplicación Android?
  • Obtener todos los sms de un teléfono Android
  • Los datos de Android enviados entre dos emuladores se truncan en tránsito
  • Interceptar, leer y cancelar el mensaje SMS
  • BroadcastReceiver SMS_Received no funciona en nuevos dispositivos
  • Obtener múltiples transmisiones de intenciones?
  • Los teléfonos de Redmi no piden permisos de SMS y por lo tanto no leen sms
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.