Метод ContentObserver onChange () вызывается много раз

У меня есть требование отслеживать любой новый файл изображения типа .jpg, созданный на устройстве. Я сделал это с помощью ContentObserver на ContentObserver используя нижеприведенный класс MediaStoreObserver и зарегистрировав его в одном из моих сервисов.

Я заметил, что onChange() много раз для создания одного файла. Я понимаю, что созданный мультимедийный файл обновляется во многих таблицах onChange() поэтому onChange() много раз.

Мой вопрос: как зарегистрироваться в MediaStore для создания / редактирования операции ТОЛЬКО изображения?

-Спасибо заранее, Манджу

  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); 

Короткий ответ: вы не можете, это поставщик, который отправляет notifyChange (полученный с наблюдателями onChange ) всякий раз, когда что-то есть: обновлено / вставлено / удалено

Более длинный ответ: это то, что было бы сделано для достижения того, что вы хотите (как зарегистрироваться в MediaStore для создания / редактирования операции ТОЛЬКО изображения):

Прочитайте таблицу изображений из MediaStore при запуске и сохраните столбец _data (пути к файлу) в отсортированной collection , отсортированную collection с путями (строки). И всякий раз, когда вы получаете вызов onChange новую коллекцию вышеуказанного типа, затем перебирайте новую коллекцию и onChange поиск по исходной коллекции, которую вы создали, с бинарным поиском (поскольку сортировка коллекции и мы хотим, чтобы временная сложность была низкой). Это приведет к довольно эффективной реализации с временем выполнения O (n * logn).

Или в псевдокоде:

 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 

Изменить для обновленной части файла, я бы прочитал поле с измененным датой из MediaStore, когда будет выполняться мой поиск на шаге 5, это будет означать, что вы должны фактически хранить как файл (uri), так и дату, измененную в классе данных, но в качестве файла поиска для поиска дорожка. Всякий раз, когда файл найден, вы должны проверить, совпадают ли измененные даты, если нет, то это обновленный файл.

У меня была такая же проблема и исправлена ​​ее удалением super.onchange из моего переопределения onchange .