Android: Cómo detectar un cambio en MediaStore cuando está conectado a través de MTP

Tengo grandes problemas con MediaStore. Necesito manejar eventos cuando se cambia MediaStore por MTP. Ya tengo un receptor para la acción android.intent.action.MEDIA_SCANNER_FINISHED , pero es útil sólo para el almacenamiento masivo universal (UMS). El escáner no se inicia en MTP, porque el MTP cambia la base de datos de MediaStore directamente.

Por favor, serías tan amable y ayudarme a detectar estos eventos. ¡Muchas gracias por cualquier ayuda!

Finalmente encontré una solución. Intenté utilizar FileObserver pero cuando usted lo utiliza para todos los directorios … es bastante memoria consumiendo. Así que ahora estoy usando ContentObserver y está funcionando bien:

 public static class UriObserver { private final Cursor mCursor; private final ContentObserver mObserver; private boolean mRunning = true; private class ObserverWithListener extends ContentObserver { private final OnChangeListener mListener; public ObserverWithListener(OnChangeListener listener) { super(new Handler()); mListener = listener; } @Override public void onChange(boolean selfChange) { if (mRunning) { log.d("Change triggered"); mListener.onChange(); } } }; public static UriObserver getInstance(ContentResolver contentResolver, Uri uri, OnChangeListener listener) { Cursor c = contentResolver.query(uri, new String[] { "*" }, null, null, null); if ((c = Dao.moveToFirst(c)) == null) { log.e("Cannot start observer for uri: " + uri); return null; } return new UriObserver(c, listener); } public UriObserver(Cursor c, final OnChangeListener listener) { mCursor = c; mObserver = new ObserverWithListener(listener); mCursor.registerContentObserver(mObserver); } public void stop() { mCursor.unregisterContentObserver(mObserver); Dao.closeCursor(mCursor); mRunning = false; } public interface OnChangeListener { public void onChange(); } } 

El flag mRunning tiene que estar allí por alguna razón porque onChange se llamaba a veces aunque unregisterContentObserver () había sido llamado antes.

Este código que estoy utilizando con Uris que quiero observar, es decir MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, …

Crear una clase de observador de contenido

 class MyObserver extends ContentObserver { public MyObserver(Handler handler) { super(handler); } @Override public void onChange(boolean selfChange) { this.onChange(selfChange, null); } @Override public void onChange(boolean selfChange, Uri uri) { doYourWorkHere(); } } 

Registrar el observador en su actividad

 Handler handler; MyObserver observer; handler = new Handler(); observer = new MyObserver(handler); this.getContentResolver(). registerContentObserver( MediaStore.Video.Media.EXTERNAL_CONTENT_URI, true, observer); 

No olvide anular el registro del observador en la función onDestroy ()

  this.getContentResolver().unregisterContentObserver(observer); 
FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.