5

La mia app elabora le immagini, posso elaborare le immagini già memorizzate nel dispositivo Android. Voglio anche elaborare nuove immagini. c'è qualche ascoltatore che mi notificherà ogni volta che arrivano nuove foto nella galleria? Ho cercato per due giorni. Non ho potuto ottenere nulla di solido.Come ascoltare nuove foto in Android?

Ho letto circa FileObserver, mi aiuterà ad ascoltare sia gli utenti che scaricano immagini o scattare nuove foto utilizzando la fotocamera?

risposta

7

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.

+0

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

+0

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). –

Problemi correlati