2015-09-02 14 views
27

Ich habe eine Anwendung, die ein öffentliches Verzeichnis auf externen Speicher FileObserver beobachtet. Es funktioniert gut auf Lollipop Geräte. Ich möchte Unterstützung für Marshmallow hinzufügen, also habe ich ein Nexus 9 Tablet damit eingerichtet.FileObserver nicht in Android 6.0 Eibisch (API 23) auf externen Speicher arbeiten

Auf dem Marshmallow-Gerät schlägt es fehl, auf Lollipop-Gerät ist es in Ordnung. Auf Marshmallow-Gerät reagiert die FileObserver nicht auf Dateisystemereignisse, die von anderen Prozessen verursacht werden. Z.B. einen Screenshot erstellen, Dateien über adb Shell erstellen. Es funktioniert gut, wenn die Dateien von meiner App erstellt werden.

Auf Marshmallow, ich frage für WRITE_EXTERNAL_STORAGE und READ_EXTERNAL_STORAGE Berechtigungen von Manifest.xml.

Wenn ich kompilieren mit API 23, mache ich auch sicher, dass ich ActivityCompat.requestPermissions() nennen.

Wenn ich mit API kompilieren 22, verlasse ich mich nur auf Manifest.xml.

Es funktioniert, wenn ich Sachen auf /data/data/my-package-name beobachten.

Es schlägt fehl, wenn ich Sachen auf /storage/emulated/0/Pictures/Screenshots beobachten.

Hat jemand Test FileObserver allen folgenden considreing? :

  • Marshmallow Gerät
  • API 23 und API 22?
  • externer Speicher
  • Dateien, die von einem anderen Prozess als der beobachtenden App erstellt wurden (z. B. adb oder Screenshot erstellen).
+0

Haben Sie andere Speicherorte auf externem Speicher ausprobiert? Es ist möglich, dass Ihr Problem aufgrund seiner Empfindlichkeit auf dieses Verzeichnis beschränkt ist. Übrigens, was Sie kompilieren, hat nichts mit dem Verhalten Ihrer App in Bezug auf Laufzeitberechtigungen zu tun; Ihre 'targetSdkVersion' funktioniert. – CommonsWare

+0

Achten Sie darauf, irgendwo einen Verweis auf den FileObserver zu behalten. Wenn es Müll gesammelt wird, wird es keine Ereignisse mehr empfangen. –

+0

Auch, FWIW, [es gibt ein Problem darüber] (https://code.google.com/p/android-developer-preview/issues/detail?id=3099). – CommonsWare

Antwort

0

Dies scheint ein Fehler in Marshmallow, see this link zu sein.

Dies ist nicht einmal in Nougat behoben, Sie könnten die API diesen ganzen FileObserver loswerden, da es die Tatsache völlig nutzlos macht, dass auf den meisten Geräten es nicht funktioniert.

0

Bitte nehmen Sie Laufzeit Berechtigung, wenn Sie eine Datei aus der Galerie erhalten.