FIleObserver y ContentObserver no funcionan en Android Marshmallow
Tengo problemas con FIleObserver y ContentObserver que no funcionan en Android Marshmallow. Estoy utilizando esto para detectar los cambios que suceden dentro de una carpeta. Establecer permisos de tiempo de ejecución para malvavisco. Pero después de eso también no muestra ningún acontecimiento. Funciona perfectamente en otras versiones. Por favor ayúdame a resolver este problema.
Primero probé Content Resolver dentro de Service para detectar cambios de carpetas en segundo plano.
- El método ContentObserver onChange () se llama muchas veces
- Aplicación de copia de seguridad y sincronización de contactos
- Actualizaciones de la base de datos Sqlite activan el servicio para actualizar a través de Content Observer
- Android evento onChange no se activa en contentObserver para la historia de cromo en android 5 (Lollypop)
- Sms ContentObserver onChange () se activa varias veces
public class TestService extends Service { @Override public void onCreate() { super.onCreate(); } @Override public int onStartCommand(Intent intent, int flags, int startId) { initial(); return START_STICKY; } public void initial(){ getContentResolver().registerContentObserver( MediaStore.Images.Media.EXTERNAL_CONTENT_URI, true, new ContentObserver(new Handler()) { @Override public boolean deliverSelfNotifications() { Log.d("hai", "deliverSelfNotifications"); return super.deliverSelfNotifications(); } @Override public void onChange(boolean selfChange) { super.onChange(selfChange); } @Override public void onChange(boolean selfChange, Uri uri) { if (uri.toString().matches(MediaStore.Images.Media.EXTERNAL_CONTENT_URI.toString() + "/[0-9]+")) { Cursor cursor = null; try { cursor = getContentResolver().query(uri, new String[] { MediaStore.Images.Media.DISPLAY_NAME, MediaStore.Images.Media.DATA }, null, null, null); if (cursor != null && cursor.moveToFirst()) { final String fileName = cursor.getString(cursor.getColumnIndex(MediaStore.Images.Media.DISPLAY_NAME)); final String path = cursor.getString(cursor.getColumnIndex(MediaStore.Images.Media.DATA)); // TODO: apply filter on the file name to ensure it's screen shot event Log.d("file", "FILE CHANGE OCCURED " + fileName + " " + path); } } finally { if (cursor != null) { cursor.close(); } } } super.onChange(selfChange, uri); } } ); } }
Y permisos de tiempo de ejecución como:
private void getPermission(){ boolean hasPermission = (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED); if (!hasPermission) { ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, REQUEST_READ_STORAGE); } }
Y recibió el resultado de permisos en onRequestPermissionsResult
. Este método no funcionó para mí. Así que intenté con FileObserver
dentro de ese servicio. Ese tiempo también funciona en todas las plataformas, pero no en Marshmallow.
- Por qué y cuándo anular el registro de observadores de contenido en android
- ¿Cómo hago que mi Android ContentObserver para ContactsContract detecte un contacto añadido, actualizado o eliminado?
- Android: ¿Cómo registrar un observador de contenido sin actividad?
- Recibir cambios de contacto (agregados, eliminados y cambiados)
- ContentObserver debe llamar si y sólo si ContactsContract.Contacts.CONTENT_URI cambia
- Android: el método "onChange ()" del observador de contenido se llama varias veces
- Android: detecta SMS saliente, cuenta incorrecta
- Bloquear SMS salientes por contentObserver
Esto parece ser un error en Marshmallow, ver aquí .
Sólo puede tratar de trabajar en torno a ella por sondeo para cualquier información que necesite.
Lo bien que esto funcionará para usted depende de su caso de uso. Lo encontré utilizable para seguir el progreso de la transferencia directa: comienzo el sondeo cuando la descarga comienza, con un intervalo de un segundo, y para cuando termina la transferencia directa.
Si espera cambios muy infrecuentes, puede intentar aumentar el intervalo, a costa de un retraso potencialmente mayor entre los cambios que ocurren y la aplicación que los recoja.
- Cómo agregar espacio a la sugerencia de AutoCompleteTextView
- Cómo obtener la ubicación del archivo de configuración wifi en android