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........"); } } 

2 Solutions collect form web for “El observador SMS enviado se ejecuta 3 veces”

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.

  • Envío de un SMS en Android a través de ADB
  • Envío y recepción de SMS y MMS en Android (pre Kit Kat Android 4.4)
  • Manera a prueba de errores de iniciar la intención de SMS en Android
  • Cómo abrir la ventana de SMS en android programatically?
  • Diferenciar MMS y SMS a través de los oyentes MMS / SMS en Android
  • Android: Marcar mensaje de texto (SMS) no leído
  • Adb emu comando no funciona a veces
  • ¿Es posible falsificar un SMS entrante en Android?
  • Detección de SMS entrantes y salientes
  • Escribir sms enviados al contenido: // sms / tabla enviada
  • Envío de SMS sin utilizar SmsManager de Android .. ¿Biblioteca nativa?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.