这是我的代码:
public class SyncNotifyService extends Service {
private final static String TAG = "FileService";
SDCardListener fileObserver = null;
@Override
public IBinder onBind(Intent intent) {
return null;
}
public File getCacheDir() {
if (!StorageUtil.isExternalStorageAvailable()) {
return null;
}
File dir = new File(Environment.getExternalStorageDirectory(), "Cache");
return dir;
}
@Override
public void onCreate() {
super.onCreate();
Log.d(TAG, "onCreate");
fileObserver = new SDCardListener(FileCache.getCacheDir().getPath(), FileObserver.MODIFY);
fileObserver.startWatching();
}
class SDCardListener extends FileObserver {
public SDCardListener(String path, int mask) {
super(path, mask);
}
@Override
public void onEvent(int event, String path) {
final int action = event & FileObserver.ALL_EVENTS;
switch (action) {
case FileObserver.MODIFY:
Log.d(TAG, "event: MODIFY");
break;
}
}
}
}
嗨,我用这段代码通知一个目录。但我发现它从来没有调用onEvent使用FileObserver。修改参数,谁知道怎么写正确的代码?我的android版本是4.1.1
也许你写onEvent的方式不合适,使用
if (!event.equals(MODIFY)) { return;}
//the code you want
if (path.equals(blah blah blah)) {
//some code..
}
这是我在FileObserver中使用的方式,试试吧…
当您创建FileObserver时,路径应该是包含您正在观察的文件的目录的绝对路径:
fileObserver = new SDCardListener(FileCache.getCacheDir().getAbsolutePath(), FileObserver.MODIFY);
同样,修改这个:
public void onEvent(int event, String path) {
switch (action) {
case FileObserver.MODIFY:
Log.d(TAG, "event: MODIFY");
break;
}
}
如果onEvent没有被触发,试着改变你初始化FileObserver的方式,让它监听ALL_EVENTS并打印被触发的事件。然后您可以找出为什么MODIFY不是触发器。
FileObserver
根本不是递归的!
检查:
https://code.google.com/p/android/issues/detail?id=33659
我建议使用RecursiveFileObserver
类:
https://github.com/owncloud/android/blob/master/src/com/owncloud/android/utils/RecursiveFileObserver.java