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
- Configuración única de Android SMS
- Receptor de radiodifusión sigue funcionando después de cerrar la aplicación - Android
- Abortar / Cancelar transmisiones
- Android - Extraer texto de SMS
- Diferenciar MMS y SMS a través de los oyentes MMS / SMS en Android
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........"); } }
- Selecciona los primeros SMS en la bandeja de entrada de la base de datos de Android
- ¿Cómo enviar un mensaje SMS en un dispositivo Android en segundo plano?
- Listín de SMS de Android para un número específico
- Identificador único para SMS y contactos (para comprobar la duplicación) en Android
- Envío de SMS a través de una Intención y saber si el SMS ha sido enviado o no
- ¿Cómo comunicar la aplicación con el servidor sin conexión a Internet?
- Clase 0 SMS (SMS flash) en Android
- ¿Podemos borrar un SMS en Android antes de que llegue a la bandeja de entrada?
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.
- Calendar.WEEK_OF_MONTH da resultados diferentes en dos dispositivos diferentes
- Eclipse Option not available: Herramientas de Android> Exportar paquete de aplicaciones sin firmar