android - 仅针对文件接收 FileObserver CREATE 或 DELETE

标签 android fileobserver

我已经为一个目录注册了一个 FileObserver。

this.observer = new DirectoryObserver(requested.getAbsolutePath(),
        FileObserver.CREATE | FileObserver.DELETE | FileObserver.DELETE_SELF);
this.observer.startWatching();

在 KitKat 模拟器上测试。 亚行外壳:

root@generic:/sdcard # echo "test" >> test.txt //notified CREATE
root@generic:/sdcard # rm test.txt //notified DELETE
root@generic:/sdcard # mkdir test //no events received
root@generic:/sdcard # rmdir test //no events received 

供引用的DirectoryObserver

private final class DirectoryObserver extends FileObserver {

    private DirectoryObserver(String path, int mask) {
        super(path, mask);
    }

    @Override
    public void onEvent(int event, String pathString) {
        switch (event) {
            case FileObserver.DELETE_SELF:
                //do stuff
                break;

            case FileObserver.CREATE:
            case FileObserver.DELETE:
                //do stuff
                break;
        }
    }
}

来自文档

CREATE
Event type: A new file or subdirectory was created under the monitored directory 

DELETE
Event type: A file was deleted from the monitored directory 

那么对于 CREATE 我应该接收文件和目录,而在 DELETE 时只接收文件? 好吧,我仍然没有收到子目录的 CREATE。

最佳答案

这是因为 android 对底层文件系统的抽象不够好,返回的底层事件代码带有一些标志(event 的一些高位)。这就是为什么直接比较 eventevent type 不起作用的原因。

要解决此问题,您可以通过将 FileObserver.ALL_EVENTS 事件掩码(使用按位和)应用到实际的 event value 将其分解为事件类型

使用您在问题中提供的代码,这看起来像这样:

private final class DirectoryObserver extends FileObserver {

    private DirectoryObserver(String path, int mask) {
        super(path, mask);
    }

    @Override
    public void onEvent(int event, String pathString) {
        event &= FileObserver.ALL_EVENTS;
        switch (event) {
            case FileObserver.DELETE_SELF:
                //do stuff
                break;

            case FileObserver.CREATE:
            case FileObserver.DELETE:
                //do stuff
                break;
        }
    }
}

关于android - 仅针对文件接收 FileObserver CREATE 或 DELETE,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20455423/

相关文章:

android - 行分隔符在 ScrollView Android 中不起作用

java - UriMatcher 没有正确匹配

android - Android 中常见的导航菜单抽屉

Android FileObserver 耗电

android - 文件观察器在待机期间处于服务状态

android - FileObserver 在后台监听,Android O

android - Android开发者官方教程中Hello World项目中的NAND错误

java - 使用 bintray 上传创建空 .jar