【问题标题】:FileObserver doesn't workFileObserver 不工作
【发布时间】:2015-09-05 04:55:41
【问题描述】:

在我的 Android 应用程序中,我想检测目录中的事件。下面是代码:

String path = Environment.getExternalStorageDirectory()
            + File.separator + "test2";
    Log.d("test", "path is " + path);

    FileObserver fileObserver = new FileObserver(path, FileObserver.ALL_EVENTS) {
        @Override
        public void onEvent(int event, String path) {
            Log.d("test", "event dectect " + event + " " + path);
        }
    };

    fileObserver.startWatching();

我将新文件复制到目录中。但我没有得到任何事件。请告诉我我在哪里犯了错误。

【问题讨论】:

  • 在目录中复制新文件时,活动可能处于暂停或停止状态。所以尝试从adb shell复制目录中的文件而不最小化Activity
  • 我使用妻子传输复制了新文件(我是从我的电脑上传的)。所以我不认为 Activity 处于 Pause 或 Stop 状态。

标签: android fileobserver


【解决方案1】:

您不能使用局部变量来存储您的 FileObserver,它可以在方法运行后用于垃圾回收。

警告:如果 FileObserver 被垃圾回收,它将停止发送 事件。为确保您继续接收事件,您必须保留参考 从其他活动对象到 FileObserver 实例。

解决方案:将其保存到字段中。

【讨论】:

    【解决方案2】:

    添加存储权限对我有用。

    【讨论】:

      【解决方案3】:

      似乎 FileObserver 不适用于符号链接,这是 Environment.getExternalStorage() 返回的内容。

      对我来说,诀窍是使用 File.getCanonicalPath() 解析链接

      例子:

      File file = new File(Environment.getExteranlStorage(), "myfile");
      new FileObserver(file.getCanonicalPath()) ...
      

      【讨论】:

        【解决方案4】:

        扩展 @user3219477 的答案,如果您没有在应用中动态请求,请务必进入 Settings->Apps->YourApp 并授予存储权限。

        【讨论】: