5

Мое приложение обрабатывает изображения, я могу обрабатывать уже сохраненные изображения в устройстве Android. Я также хочу обрабатывать новые изображения. есть ли какой-либо слушатель, который будет уведомлять меня, когда новые фотографии поступят в галерею? Я искал два дня. Я не мог получить ничего твердого.Как слушать новые фотографии в Android?

Я читал около FileObserver, поможет ли он прослушать как пользователей, загружающих изображения, так и новых фотографий с помощью камеры?

ответ

7

новых фотографий прибывает в галерею

означает, что он был добавлен в MediaStore.

Прежде всего, FileOberver - это подход, основанный на использовании памяти. Рассмотрим большой объем файлов. Скорее ContentObserver кажется гораздо лучшим подходом.

getContentResolver().registerContentObserver(android.provider.MediaStore.Images.Media.INTERNAL_CONTENT_URI, true, 
     new ContentObserver(new Handler()) { 
      @Override 
      public void onChange(boolean selfChange) { 
       Log.d("your_tag","Internal Media has been changed"); 
       super.onChange(selfChange); 
       Long timestamp = readLastDateFromMediaStore(context, MediaStore.Images.Media.INTERNAL_CONTENT_URI); 
       // comapare with your stored last value and do what you need to do 

      } 
     } 
    ); 
getContentResolver().registerContentObserver(android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI, true, 
    new ContentObserver(new Handler()) { 
     @Override 
     public void onChange(boolean selfChange) { 
      Log.d("your_tag","External Media has been changed"); 
      super.onChange(selfChange); 

      Long timestamp = readLastDateFromMediaStore(context, MediaStore.Images.Media.EXTERNAL_CONTENT_URI); 
      // comapare with your stored last value and do what you need to do 
     } 
    } 
); 

private Long readLastDateFromMediaStore(Context context, Uri uri) { 
     Cursor cursor = context.getContentResolver().query(uri, null, null, null, "date_added DESC"); 
     PhotoHolder media = null; 
     Long dateAdded =-1; 
     if (cursor.moveToNext()) { 
      Long dateAdded = cursor.getLong(cursor.getColumnIndexOrThrow(MediaColumns.DATE_ADDED));   
     } 
     cursor.close(); 
     return dateAdded; 
} 

Возможно, это хорошая идея сделать это в службе (когда-либо работающей)! Вам также необходимо будет отменить регистрацию в onDestroy()

Предупреждение. Это только говорит о том, что когда MediaStore был изменен, это не говорит ничего конкретного о добавлении/удалении. Для этого вам, возможно, придется запросить MediaStore, чтобы обнаружить какие-либо изменения из вашей предыдущей базы данных или что-то еще.

+0

Итак, вы предлагаете нам сделать базу данных в качестве сравнения, чтобы мы могли обнаружить о добавлении или удалении? Разве это не слишком избыточно? Новый андроид ContentObserver имеет 'public void onChange (boolean selfChange, Uri uri)' Как вы думаете, мы можем использовать это для обнаружения добавления/удаления? – HendraWD

+0

1.Да, тогда нам понадобится наша собственная база данных. 2. Нет, его не так много переборщит. Позвольте мне объяснить, вы должны иметь информацию о времени, когда вы последний раз проверяли. Поэтому, когда вы запрашиваете, вам необходимо обновить свою базу данных до того времени. 3. Это onChange() может быть полезно, но, тем не менее, я не использовал его, поэтому не могу точно. Документация говорит: для обеспечения правильной работы в старых версиях фреймворка, которые не предоставляют аргумент Uri, приложения также должны реализовывать перегрузку onChange (boolean) этого метода всякий раз, когда они реализуют перегрузку onChange (boolean, Uri). –

Смежные вопросы