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!
- ¿Cómo configurar la configuración predeterminada de Android M en MTP en lugar de "cargar solo"?
- Nexus 4 no muestra archivos a través de MTP
- Conectado un dispositivo móvil (Android) como MTP, ahora podemos acceder a este dispositivo y obtener tiempo
- Acceso al dispositivo mtp con java
- ¿Cómo administrar archivos en un dispositivo portátil MTP?
- Montaje de un Samsung Galaxy Tab 2 7.0 con MTP en Linux
- ¿Cuál es la ruta de acceso del archivo a especificar para transferir un archivo de Android a Windows PC?
- Copia de la aplicación de escritorio java y transferencia de datos de android a través de USB
- De cualquier manera automáticamente permiten la solicitud de aprobación de conexión MTP a la conexión USB?
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);