我自己有一个应用程序,它通过 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 标准合规性)