1

我的代码使用FileObserver监听 DCIM 文件夹。

我使用的所有 Android 版本,除了 4.1.1,只发送了 1 个事件 - 当视频完成拍摄时。我认为这是正确的行为 - 持续写入并在完成后关闭。

不过,在 4.1.1(Galaxy Nexus 和 Nexus S)中,事件FileObserver.CLOSE_WRITE被发送 两次 - 视频开始时和结束时

照片也一样——事件被发送了两次——尽管它不是那么重要。

问题是我无法区分视频的开始事件和结束事件。

我可以尝试检查文件的大小,但由于事件可能已延迟(慢/忙设备),大小可能非常大。

知道为什么行为会改变吗?你知道相机的app源码在哪里吗?我可以试着看看历史来理解这一点。

4

2 回答 2

0

正如我在我的一条评论中所写的,4.1 和以前的 Android 版本之间的区别在于,在 4.1.1 中,文件被写入和关闭两次。当创建一个空的视频文件时。然后将视频写入 tmp 文件。那么tmp文件的重命名/拷贝就是第二个write_close事件。

在以前的版本中,没有 tmp 文件——只有原始文件——因此只有一个 close_write 事件。

如果您认为这是一个错误,请发表评论。我不确定。

于 2012-08-17T06:52:44.743 回答
0

我自己有一个应用程序,它通过 FileObserver 监控 DCIM/Camera 目录。我注意到并且可能对您有所帮助的是,第一个操作是 CLOSE_WRITE,但最终操作是从 .tmp 到真实文件的 MOVED_TO,这意味着您可以识别视频何时(真正)准备好.

由于我的应用程序的要求,我的真实代码更复杂,但总体思路是这样的:

/* My FileObserver implementation field */
private HashSet<String> jbCache = new HashSet(...)

...

protected void onEvent(int event, String path) {
   boolean isJellyBean = Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLYBEAN;

   if ((event & FileObserver.CLOSE_WRITE) > 0) {
      if (isJellyBean) {
         jbCache.add(path);
      } else {
         performYourWork(path);
      }
   } else if ((event & FileObserver.MOVED_TO) > 0 && isJellyBean && jbCache.contains(path)) {
      performYourWork(path);
      jbCache.remove(path);
   }
}

显然,当您注册要捕获的事件时,您必须同时收听 CLOSE_WRITE 和 MOVED_TO。

尽管我为您的错误加了星标,但我怀疑 Google 是否会承认这一点,因为看起来更改背后可能有一些(令人不快的)原因。无论如何,相机应用程序大多是非标准的废话(例如:假 DCIM 标准合规性)

于 2013-01-04T22:02:04.473 回答