8

ho problema sia con FIleObserver e ContentObserver non funziona in Android Marshmallow. Sto usando questa cosa per rilevare i cambiamenti che accadono all'interno di una cartella. Ho impostato i permessi di esecuzione per marshmallow. Ma dopo anche questo non mostra eventi. Funziona perfettamente in altre versioni. Per favore aiutami a risolvere questo problema.FIleObserver e ContentObserver non funziona in Android Marshmallow

Prima ho provato Content Resolver all'interno del servizio per rilevare le modifiche alle cartelle in background.

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); 
        } 
       } 
     ); 

    } 
} 

e le autorizzazioni di run-time come:

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); 
    } 
} 

e ricevuto che le autorizzazioni risultano in onRequestPermissionsResult. Questo metodo non ha funzionato per me. Così ho provato con FileObserver all'interno di quel servizio. Quella volta funziona anche su tutte le altre piattaforme, ma non su Marshmallow.

risposta

3

Questo sembra essere un bug in Marshmallow, see here.

Si può solo provare a lavorare attorno ad esso per qualsiasi informazione richiesta.

Quanto bene questo funzionerà per voi dipende dal vostro caso d'uso. L'ho trovato utilizzabile per monitorare lo stato del download: avvia il polling all'avvio del download, con un intervallo di un secondo, e si ferma al termine del download.

Se si prevedono modifiche molto infrequenti, è possibile provare ad aumentare l'intervallo, al costo di un ritardo potenzialmente maggiore tra le modifiche che si verificano e l'app che le preleva.