8

Ich habe Problem mit beiden FIleObserver und ContentObserver nicht in Android Eibisch arbeiten. Ich verwende dieses Ding, um Änderungen innerhalb eines Ordners zu erkennen. Ich habe Laufzeitberechtigungen für Marshmallow festgelegt. Aber auch danach zeigt es keine Ereignisse. Es funktioniert perfekt in anderen Versionen. Bitte helfen Sie mir, dieses Problem zu lösen.FIleObserver und ContentObserver arbeiten nicht in Android Eibisch

Zuerst habe ich Content Resolver im Service versucht Ordneränderungen im Hintergrund zu erkennen.

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

    } 
} 

und Laufzeit-Berechtigungen wie:

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

Und erhalten, dass Berechtigungen in onRequestPermissionsResult führen. Diese Methode hat bei mir nicht funktioniert. Also habe ich versucht mit FileObserver in diesem Service. Zu dieser Zeit funktioniert es auch in allen anderen Plattformen, aber nicht in Marshmallow.

Antwort

3

Dies scheint ein Fehler in Marshmallow, see here zu sein.

Sie können nur versuchen, um es zu umgehen, indem Sie für die Informationen, die Sie benötigen, abfragen.

Wie gut das für Sie funktioniert, hängt von Ihrem Anwendungsfall ab. Ich habe festgestellt, dass es für die Verfolgung des Download-Fortschritts nützlich ist: Beginnen Sie mit dem Abruf, wenn der Download startet, mit einem Intervall von einer Sekunde, und halten Sie an, wenn der Download beendet ist.

Wenn Sie sehr selten Änderungen erwarten, können Sie versuchen, das Intervall zu erhöhen - auf Kosten einer potenziell höheren Verzögerung zwischen den Änderungen und der Abholung durch Ihre App.

Verwandte Themen