Android 果冻豆在视频开始时发送CLOSE_WRITE事件,而不仅仅是在视频结束时发送



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

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

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

照片也是如此 - 事件发送两次 - 尽管它不是那么重要。

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

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

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

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

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

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

我自己有一个应用程序,通过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。

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

最新更新