当一个视频开始播放时,Android jelly bean发送一个CLOSE_WRITE事件

问题描述:

我的代码使用FileObserver来监听DCIM文件夹。当一个视频开始播放时,Android jelly bean发送一个CLOSE_WRITE事件

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

在4.1.1(Galaxy Nexus的和Nexus S)虽然,事件FileObserver.CLOSE_WRITE发送 两次 - 时,当它结束视频的开始和。

同样的照片 - 事件发送两次 - 虽然它并不那么重要。

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

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

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

+0

也许文件现在创建空(&关闭),然后数据附加到该空文件(再次关闭)。来源可能是[> this zapl 2012-08-16 12:20:20

+0

您是否已经完成了对此的研究并检查了AOSP源?如果您的观察结果显示行为发生变化,那么历史通常在github上找到,然后出于某种原因。话虽如此,源代码从GB到ICS以及从ICS到JB ......非常不同,也许尝试google的android新闻组或irc? – t0mm13b 2012-08-16 12:32:22

+0

@zapl该项目甚至没有清单文件:(我试着看着https://android.googlesource.com/platform/packages/apps/Camera.git - 没有AndroidManifest.xml。 – 2012-08-16 13:27:09

正如我在one of my comments中所写的,4.1和以前的Android版本之间的区别在于4.1.1中的文件被写入并关闭了两次。一旦创建了一个空的视频文件。然后将视频写入tmp文件。然后,tmp文件的重命名/副本是第二个write_close事件。

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

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

+0

打开了一个有关解决内容的错误:http://code.google.com/p /安卓/问题/细节?ID = 36543 – 2012-09-14 07:07:19

我有一个应用程序,通过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显然,要抓住。

虽然我主演了你的bug,但我怀疑谷歌会不会承认它,因为看起来可能会有一些(令人不快的)推理背后的变化。相机应用程序大多是一个非标准的废话无论如何(例如:伪DCIM标准合规)