El método ContentObserver onChange () se llama muchas veces

Tengo requisito para seguir cualquier nuevo archivo de imagen del tipo .jpg creado en el dispositivo. He hecho esto usando ContentObserver en MediaStore usando debajo de la clase MediaStoreObserver y, registrando el mismo en uno de mi servicio.

He notado que el método onChange() se llama muchas veces para una sola creación de archivo. Entiendo que el archivo multimedia creado se actualiza en muchas tablas de MediaStore por onChange() tanto onChange() se llama muchas veces.

Mi pregunta: ¿Cómo registrarse en MediaStore para la operación de creación / edición de archivos de imagen SOLAMENTE?

-Gracias de antemano, Manju

  private class MediaStoreObserver extends ContentObserver { public MediaStoreObserver() { super(null); } @Override public void onChange(boolean selfChange) { super.onChange(selfChange); //check image file changes in MediaStore readFromMediaStore(_context,MediaStore.Images.Media.EXTERNAL_CONTENT_URI); } } //register for external media changes for image files if(mediaStoreObserver!=null){ _context.getContentResolver().registerContentObserver(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, false,mediaStoreObserver); 

Respuesta corta: No puedes, es el proveedor quien envía notifyChange (recibido con los observadores onChange ) cuando algo es: actualizado / insertado / eliminado

Respuesta más larga: Esto es lo que habrías hecho para lograr lo que quieres (¿Cómo registrarte en MediaStore para la operación de creación / edición de archivos de imagen SOLAMENTE?):

Leer la tabla de imágenes de MediaStore al iniciar y almacenar la columna _data (rutas de archivo), en una collection ordenada, una collection ordenada con rutas (cadenas). Y siempre que reciba una llamada onChange haga una nueva colección de la clase anterior, luego haga un bucle sobre la nueva colección y busque la colección original que creó, con búsqueda binaria (ya que la colección está ordenada y queremos mantener la complejidad del tiempo baja). Esto llevaría a una implementación bastante eficaz con tiempo de ejecución de O (n * logn).

O en pseudo código:

 1. Read current image columns from media store (the `_data column as projection) 2. Store result in a collection, with string type 3. Sort collection 4. Upon `onChange` is received, make a new collection as step 1-3 5. Loop over collection created in 4 and search each string you take out with binary search in the sorted collection you got from step 3, if item is not found then the item is new 6. Make the collection in 4 the current cached version of mediastore 7. Time complexity is O(n*log n) for the above algorithm 

Editar para la parte del archivo actualizado que leería el campo de fecha modificada de MediaStore siempre que mi búsqueda en el paso 5 hits, eso significaría que realmente debe almacenar tanto archivo (uri) y la fecha modificada en una clase de datos, pero como búsqueda de búsqueda utilizar archivo camino. Siempre que se encuentre el archivo debe comprobar si las fechas modificadas coinciden, si no, entonces es un archivo actualizado.

Tuve este mismo problema y lo arregló mediante la eliminación de super.onchange de mi super.onchange onchange .

  • FIleObserver y ContentObserver no funcionan en Android Marshmallow
  • ContentObserver vs BroadCastReceiver: Uso de la batería, RAM, CPU?
  • Cómo detectar nuevas aplicaciones en un dispositivo Android
  • Buscar contactos con la aplicación instalada
  • Android: observador de contenido para contenido: // sms / enviado no funciona
  • ContentObserver onChange
  • ContentObserver se llama incluso cuando no hay cambios en el cursor
  • NotifyChange con uri modificado de contentProvider.update ()
  • ¿Por qué el ContentObserver se llama varias veces?
  • ¿Puedes determinar qué cambios de contacto tienen con registerContentObserver?
  • Android: detecta SMS saliente, cuenta incorrecta
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.