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.
- El observador SMS enviado se ejecuta 3 veces
- Contactos ContentObserver llamado aleatoriamente
- ContentObserver no funciona en android
- Android: ¿Cómo registrar un observador de contenido sin actividad?
- Observación de cambios en el observador de contenido android de Audio.Media.EXTERNAL_CONTENT_URI
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);
- El método onChange de Content Observer se disparó varias veces
- ContentObserver para los cambios de contacto de escucha
- Cómo escuchar el contacto insertado / actualizado / eliminado en la libreta de direcciones
- Sms ContentObserver onChange () se activa varias veces
- Cuando se llama a ContentResolver.notifyChange () para un URI determinado, ContentObservers observa los URI descendientes de este URI notificados?
- Bloquear SMS salientes por contentObserver
- Observador de contenido de Android History
- Android evento onChange no se activa en contentObserver para la historia de cromo en android 5 (Lollypop)
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
.
- ¿Por qué es imposible acceder a los recursos de manera estática?
- ¿Cuál es la diferencia entre Métodos Definidos y Métodos Referidos en el estudio Android Apk Analyzer