ảnh mới đến với phòng trưng bày
có nghĩa là nó đã được bổ sung vào MediaStore
.
Trước hết, FileOberver
là phương pháp tiếp cận trí nhớ. Hãy xem xét một khối lượng lớn các tập tin. Thay vào đó, ContentObserver
có vẻ là một cách tiếp cận tốt hơn nhiều.
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;
}
Có thể là một ý tưởng hay khi làm điều này trong một dịch vụ (bao giờ hết)! Bạn cũng cần phải hủy đăng ký trong số onDestroy()
Cảnh báo: Điều này chỉ cho bạn biết khi nào MediaStore đã được thay đổi, nó không cho biết bất kỳ điều gì cụ thể về việc thêm/xóa. Đối với điều này, bạn có thể phải truy vấn MediaStore để phát hiện bất kỳ thay đổi nào từ cơ sở dữ liệu trước đó của bạn hoặc một cái gì đó.
Nguồn
2016-03-12 07:03:52
Vì vậy, bạn đề xuất rằng chúng tôi nên tạo cơ sở dữ liệu làm so sánh, vì vậy chúng tôi có thể phát hiện thêm hoặc xóa? Không phải là nó quá quá mức? New ContentObserver android có 'public void onChange (boolean selfChange, Uri uri)' bạn có nghĩ chúng ta có thể sử dụng nó để phát hiện thêm/xóa không? – HendraWD
1.Có, chúng tôi sẽ cần cơ sở dữ liệu riêng của chúng tôi sau đó. 2. Không có nó quá nhiều. Hãy để tôi giải thích, bạn nên có thông tin về thời gian bạn đã kiểm tra lần cuối. Vì vậy, khi bạn đang truy vấn, bạn cần phải cập nhật cơ sở dữ liệu của bạn tối đa ngày giờ đó. 3. Điều này onChange() có thể hữu ích, nhưng tuy nhiên tôi đã không sử dụng nó vì vậy không thể chắc chắn. Tài liệu nói - Để đảm bảo hoạt động chính xác trên các phiên bản cũ của khung không cung cấp đối số Uri, các ứng dụng cũng nên thực hiện quá tải onChange (boolean) của phương thức này bất cứ khi nào chúng thực hiện quá tải onChange (boolean, Uri). –