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.

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.

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.

  • ContentObserver vs BroadCastReceiver: Uso de la batería, RAM, CPU?
  • Cómo manejar llamadas REST, persistencia de datos, sincronización y observación de ContentProvider
  • ContentObserver no funciona en android
  • Observador de contenido de Android History
  • ¿Por qué el ContentObserver se llama varias veces?
  • ¿Diferencia entre ContentObserver y DatasetObserver?
  • ¿Puedes determinar qué cambios de contacto tienen con registerContentObserver?
  • ContentObserver se llama incluso cuando no hay cambios en el cursor
  • ContentObserver onChange
  • Cuando se llama a ContentResolver.notifyChange () para un URI determinado, ContentObservers observa los URI descendientes de este URI notificados?
  • Android ContentObserver: cómo detectar el nuevo contacto añadido en la lista de contactos de Android?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.