Android jelly bean在视频开始时而不是刚刚结束时发送CLOSE_WRITE事件

Android jelly bean在视频开始时而不是刚刚结束时发送CLOSE_WRITE事件,android,video,android-4.2-jelly-bean,fileobserver,Android,Video,Android 4.2 Jelly Bean,Fileobserver,我的代码使用 我使用的所有Android版本,除了4.1.1,在视频拍摄完成时只发送了一个事件。 我认为这是正确的行为——不断地写,写完就结束 在4.1.1(Galaxy Nexus和Nexus S)中,事件被发送 两次-视频开始和结束时 照片也是一样——活动发送了两次——虽然没有那么重要 问题是我无法区分视频的开始事件和结束事件 我可以尝试检查文件的大小,但由于事件可能已被延迟(设备慢/忙),因此大小可能相当大 你知道为什么行为会改变吗?你知道相机的应用程序源代码在哪里吗?我可以试着看看历史来

我的代码使用

我使用的所有Android版本,除了4.1.1,在视频拍摄完成时只发送了一个事件。 我认为这是正确的行为——不断地写,写完就结束

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

照片也是一样——活动发送了两次——虽然没有那么重要

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

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

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

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

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


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

我有一个通过FileObserver监控DCIM/摄像机目录的应用程序。我注意到并可能对您有所帮助的是,第一个操作是关闭写入,但最后一个操作是将.tmp移动到真实文件,这意味着您可以识别视频何时(真正)准备就绪

由于我的应用程序的要求,我的实际代码更加复杂,但总体思路如下:

/* 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);
   }
}
/*我的FileObserver实现字段*/
私有HashSet jbCache=新HashSet(…)
...
受保护的void onEvent(int事件,字符串路径){
布尔值isJellyBean=Build.VERSION.SDK\u INT>=Build.VERSION\u code.JELLYBEAN;
如果((事件和文件观察者关闭_写入)>0){
如果(是果冻豆){
jbCache.add(路径);
}否则{
执行任务(路径);
}
}else if((event&FileObserver.MOVED_TO)>0&&isJellyBean&&jbCache.contains(path)){
执行任务(路径);
jbCache.remove(路径);
}
}
显然,当您注册想要捕获的事件时,您必须同时收听CLOSE_WRITE和MOVED_to


虽然我在你的bug中扮演了主角,但我怀疑谷歌是否会承认这一点,因为这一变化背后似乎有一些(令人不快的)原因。摄像头应用程序基本上都是非标准垃圾(例如:伪DCIM标准合规)

可能现在创建的文件是空的(&closed),然后将数据附加到该空文件中(&closed)。来源可能是>这你对此做了研究并检查了AOSP来源了吗?在github上通常可以找到历史记录,如果您的观察结果表明行为发生了变化,那么这是有原因的。话虽如此,从GB到ICS,从ICS到JB,源极为不同。。。。也许可以试试谷歌的android新闻组或irc?@zapl该项目甚至没有清单文件:(我尝试查看-没有AndroidManifest.xml。关键类是VideoCamera:在该类中关闭的不是mVideoFileDescriptor。可能是在将其传递给mMediaRecorder或mEffectsRecorder时?打开了一个有关内容解析的错误: