在Android 6.0 Marshmallow (API 23)中,FileObserver在外部存储上不起作用。

32
我有一个应用程序,使用FileObserver观察外部存储上的公共目录。在Lollipop设备上可以正常工作。我想添加对Marshmallow的支持,因此我设置了一个配备了Marshmallow的Nexus 9平板电脑。
Marshmallow设备上失败了,在Lollipop设备上没问题。在Marshmallow设备上,FileObserver不会对其他进程引起的文件系统事件做出反应。例如,通过adb shell拍摄屏幕截图或创建文件。如果文件是由我的应用程序创建的,则可以很好地工作。
Marshmallow上,我从Manifest.xml中请求WRITE_EXTERNAL_STORAGEREAD_EXTERNAL_STORAGE权限。
当我使用API 23进行编译时,我还确保调用ActivityCompat.requestPermissions()
当我使用API 22进行编译时,我只依赖于Manifest.xml
如果我观察/data/data/my-package-name上的内容,则可以正常工作。
如果我观察/storage/emulated/0/Pictures/Screenshots上的内容,则失败。
是否有人考虑过所有以下因素而测试了FileObserver
  • Marshmallow设备
  • API 23和API 22?
  • 外部存储
  • 由观察应用程序之外的某些其他进程创建的文件(例如,adb或屏幕截图)。

你尝试过在外部存储的其他位置吗?鉴于该目录具有一定的敏感性,你的问题可能仅限于该目录。顺便问一句,你使用的编译工具与运行时权限无关;你的 targetSdkVersion 才是关键。 - CommonsWare
请确保在某处保留对FileObserver的引用。如果它被垃圾回收,它将停止接收事件。 - Mister Smith
另外,值得一提的是,关于这个问题已经有一个问题报告被提交了(https://code.google.com/p/android-developer-preview/issues/detail?id=3099)。 - CommonsWare
@GaborFekete 你解决问题了吗?我正在使用API 22并想要检测新的屏幕截图。但是FileObserver不起作用。 - TOP
1
@Sunshinetpu 我暂时放弃了,希望它会神奇地修复。与此同时,您可以在这里找到我的测试应用程序:https://github.com/feher/Android-FileObserverTest - feher-melos
显示剩余10条评论
1个回答

2

这似乎是Marshmallow的一个bug,请看此链接

即使到了Nougat版本,这个问题仍未解决,您可以放弃使用整个FileObserver API,因为在大多数设备上它都无效。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接