【问题标题】:android fileObserver onEvent not being calledandroid fileObserver onEvent没有被调用
【发布时间】:2015-05-27 17:19:58
【问题描述】:

我正在尝试确定文件何时被修改。目前我有一个类文件观察者类,其中包含

public class fileObserver extends FileObserver {
    public String absolutePath;
    public fileObserver(String path) {
        super(path, FileObserver.ALL_EVENTS);
        absolutePath = path;
    }

    @Override
    public void onEvent(int event, String path) {
        if (path == null) {
            return;
        }
        if (event == FileObserver.MODIFY) {
            Log.d("change","changed");
        }
    }
}

在我的主要活动中,我有

fileObserver test = new fileObserver(fullpathnamehere);
test.startWatching();

fullpathnamehere 是我要观察的文件的文件路径。我检查了,文件路径是有效的。谁能告诉我我做错了什么?

【问题讨论】:

  • 这里的“fullpathnamenere”是什么...它是一个有效的目录名吗?
  • 我检查了,我输入的路径是有效的。我对原始问题进行了编辑以澄清
  • 另一件事是 onEvent() 如果“fullpathnamenere”的直接子项被修改则被触发...如果子文件夹或子子文件夹被修改则不会触发...。表示文件观察者不是迭代的。
  • fullpathnamehere 是实际文件的路径。例如:sdcard/stuff.txt
  • 你能用 FileManager 检查你的文件 stuff.txt 的真实路径吗?

标签: java android fileobserver


【解决方案1】:

方法onEvent()没有被调用,因为路径不正确:

event fileObserver test = new fileObserver(fullpathnamenere);
test.startWatching();

检查你的文件路径是否正确!

尝试使用:

String fullpathnamenere = Environment.getExternalStorageDirectory().getPath() + "/stuff.txt";

更新:

我发现(感谢 Mark Murphy 先生)FileObserver 不是递归的!

检查这个https://code.google.com/p/android/issues/detail?id=33659

我建议使用RecursiveFileObserver https://github.com/owncloud/android/blob/master/src/com/owncloud/android/utils/RecursiveFileObserver.java

【讨论】:

  • 我使用完全相同的文件路径从文件中读取,并且能够正确地从文件中读取。
【解决方案2】:

像这样改变你的 onEvent() 方法...

 @Override
    public void onEvent(int event, String path) {
        if (path == null) {
            return;
        }
        if ((FileObserver.MODIFY & event)!=0&&path.equals("file_name")) {
            Log.d("change","changed");
        }
    }

在活动中

fileObserver test = new fileObserver(parent_dir_path_of_the_file);
test.startWatching();

【讨论】:

  • 为文件的父目录注册文件观察器,您将在 onEvent() 方法中将文件名作为“路径”字符串...这可能有效....跨度>
  • 嗨...@AlexanderWen 实现了文件观察功能...?
  • 不,我实际上使用了不同的方法来获得相同的结果。我没有观察数据何时发生变化然后输出新数据,而是决定以固定间隔读取数据。
  • 我认为问题出在活动上。您正在活动中调用 startWatching()。这里发生的情况是,当您从活动中返回时,活动将被销毁并且文件观察器将被停止。您需要做的是启动一个服务并在服务中初始化文件观察器并开始在那里观看。它可能对您有用...一旦尝试并告诉我它是否有效...我认为以固定间隔读取数据不是一个好主意!!!
【解决方案3】:

您必须检查的事项:

  1. 检查文件路径。
  2. 检查清单文件中的文件权限。
  3. 如果6.0以上必须动态添加权限。

【讨论】:

    【解决方案4】:

    你准备好接受正确的答案了吗?

    我遇到了同样的问题,我没有从 FileObserver 获得更新。可能是什么问题呢? File Observer 是一个非常非常非常简单的抽象类;只有三种方法。而且只有一个可以实现!

    我开始在不同的条件下进行测试,并开始得到 onEvent() 的响应!我使用 JStudio 文件管理器复制了一个文件并得到了响应。然后我再次使用了手机附带的文件管理器。没有回应!!

    所以实际上,如果您手机的文件管理系统进行任何更改,您将不会收到事件。如果第三方软件发生更改,您可能会收到通知。

    这很糟糕。

    一个解决方案可能是使用 JNI 在 C 中创建一个本地文件观察器;使用 linux api。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-26
      • 1970-01-01
      • 2019-09-02
      相关资源
      最近更新 更多