8

Mam problem z zarówno FIleObserver i ContentObserver nie działa w Android Marshmallow. Używam tej rzeczy do wykrywania zmian zachodzących wewnątrz folderu. Ustawiłem uprawnienia czasu pracy dla ptasie mleczko. Ale potem także nie pokazuje żadnych zdarzeń. Działa doskonale w innych wersjach. Pomóż mi rozwiązać ten problem.FIleObserver i ContentObserver nie działa w Android Marshmallow

Najpierw próbowałem funkcji Content Resolver in Service, aby wykryć zmiany w folderze w tle.

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

    } 
} 

i pozwoleń czasowych run as:

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

i otrzymał że uprawnienia skutkować onRequestPermissionsResult. Ta metoda nie działa dla mnie. Więc próbowałem z FileObserver wewnątrz tej usługi. Tym razem działa również na wszystkich innych platformach, ale nie na Marshmallow.

Odpowiedz

3

Wygląda na to, że jest to błąd w Marshmallow, see here.

Możesz próbować jedynie obejść go, wykonując sondowanie w poszukiwaniu potrzebnych informacji.

To, jak dobrze to będzie działać, zależy od Twojego przypadku użycia. Zauważyłem, że jest on użyteczny do śledzenia postępów pobierania: rozpocznij pobieranie po rozpoczęciu pobierania z interwałem jednej sekundy i zatrzymaj się po zakończeniu pobierania.

Jeśli spodziewasz się bardzo nieczęstych zmian, możesz spróbować zwiększyć interwał - kosztem potencjalnie większego opóźnienia między zmianami i pobieraniem przez aplikację.

Powiązane problemy