監視対象ファイルの名前を変更すると機能します。これが私のテストオブザーバーです:
final FileObserver fo = new FileObserver(f.getPath()) {
@Override
public void onEvent(int event, String path) {
System.out.println(">>> Event: " + event + "; path: " + path);
if((event & FileObserver.ACCESS) > 0){
System.out.println(">>> ACCESS");
}
if((event & FileObserver.ALL_EVENTS) > 0){
System.out.println(">>> ALL_EVENTS");
}
if((event & FileObserver.ATTRIB) > 0){
System.out.println(">>> ATTRIB");
}
if((event & FileObserver.CLOSE_NOWRITE) > 0){
System.out.println(">>> CLOSE_NOWRITE");
}
if((event & FileObserver.CLOSE_WRITE) > 0){
System.out.println(">>> CLOSE_WRITE");
}
if((event & FileObserver.CREATE) > 0){
System.out.println(">>> CREATE");
}
if((event & FileObserver.DELETE) > 0){
System.out.println(">>> DELETE");
}
if((event & FileObserver.DELETE_SELF) > 0){
System.out.println(">>> DELETE_SELF");
}
if((event & FileObserver.MODIFY) > 0){
System.out.println(">>> MODIFY");
}
if((event & FileObserver.MOVE_SELF) > 0){
System.out.println(">>> MOVE_SELF");
}
if((event & FileObserver.MOVED_FROM) > 0){
System.out.println(">>> MOVED_FROM");
}
if((event & FileObserver.MOVED_TO) > 0){
System.out.println(">>> MOVED_TO");
}
if((event & FileObserver.OPEN) > 0){
System.out.println(">>> OPEN");
}
}
};
logcat の出力は次のとおりです。
>>> Event: 2048; path: null
>>> ALL_EVENTS
>>> MOVE_SELF
>>> Event: 32768; path: null
ご覧のとおり、2 つのイベントが受信されました。最初のものには、フラグMOVE_SELF
とALL_EVENTS
. 2 番目のものは非常に奇妙で、フラグが含まれていません。
ディレクトリの名前を変更した場合、子ファイルではなくディレクトリでイベントが発生することは論理的に思えます。オブザーバーをディレクトリにアタッチする必要があります。
編集: docsによると、 InotifyFileObserver
を使用して実装され、wiki によると:
inotify はディレクトリの再帰的な監視をサポートしていません。つまり、サブディレクトリごとに別の inotify 監視を作成する必要があります。