nuove foto arriva alla galleria
significa che è stato aggiunto alla MediaStore
.
Prima di tutto, FileOberver
è un approccio di memoria-killer. Considera un elevato volume di file. Piuttosto ContentObserver
sembra un approccio molto migliore.
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;
}
Probabilmente è una buona idea farlo in un servizio (sempre in esecuzione)! Dovrai anche annullare la registrazione nel onDestroy()
Attenzione: questo ti dice solo quando il MediaStore è stato modificato, non è detto niente di specifico sull'aggiunta/eliminazione. Per questo, potrebbe essere necessario interrogare il MediaStore per rilevare eventuali modifiche dal database precedente o qualcosa del genere.
fonte
2016-03-12 07:03:52
Quindi si consiglia di creare un database come confronto, in modo che possiamo rilevare l'aggiunta o la cancellazione? Non è troppo eccessivo? Nuovo Android ContentObserver ha 'public void onChange (booleano selfChange, Uri uri) 'pensi che possiamo usarlo per rilevare aggiunte/cancellazioni? – HendraWD
1.Sì, avremo quindi bisogno del nostro database. 2. No, non è così eccessivo. Lascia che ti spieghi, dovresti avere le informazioni sull'ora in cui hai controllato l'ultima volta. Pertanto, quando si esegue una query, è necessario aggiornare il database fino a tale data. 3. Questo onChange() potrebbe essere utile, ma comunque non l'ho usato, quindi non lo posso di sicuro. La documentazione dice - Per assicurare il corretto funzionamento su versioni precedenti del framework che non fornivano un argomento Uri, le applicazioni dovrebbero anche implementare l'overload onChange (booleano) di questo metodo ogni volta che implementano il sovraccarico onChange (booleano, Uri). –