новых фотографий прибывает в галерею
означает, что он был добавлен в 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, чтобы обнаружить какие-либо изменения из вашей предыдущей базы данных или что-то еще.
Итак, вы предлагаете нам сделать базу данных в качестве сравнения, чтобы мы могли обнаружить о добавлении или удалении? Разве это не слишком избыточно? Новый андроид ContentObserver имеет 'public void onChange (boolean selfChange, Uri uri)' Как вы думаете, мы можем использовать это для обнаружения добавления/удаления? – HendraWD
1.Да, тогда нам понадобится наша собственная база данных. 2. Нет, его не так много переборщит. Позвольте мне объяснить, вы должны иметь информацию о времени, когда вы последний раз проверяли. Поэтому, когда вы запрашиваете, вам необходимо обновить свою базу данных до того времени. 3. Это onChange() может быть полезно, но, тем не менее, я не использовал его, поэтому не могу точно. Документация говорит: для обеспечения правильной работы в старых версиях фреймворка, которые не предоставляют аргумент Uri, приложения также должны реализовывать перегрузку onChange (boolean) этого метода всякий раз, когда они реализуют перегрузку onChange (boolean, Uri). –