Как слушать новые фотографии в Android?

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

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

1 ответ

Решение

новые фотографии поступают в галерею

означает, что он был добавлен к 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, чтобы обнаружить любые изменения из вашей предыдущей базы данных или что-то еще.