当前位置: 代码迷 >> Android >> 【Android】监听资料和目录的创建删除移动等事件
  详细解决方案

【Android】监听资料和目录的创建删除移动等事件

热度:89   发布时间:2016-05-01 17:26:36.0
【Android】监听文件和目录的创建删除移动等事件

?

出于安全上的需要,我们经常需要监听sd卡或者其他路径上的文件夹创建,那么,如何实现呢,由于android sdk提供了丰富易用的接口,所以问题很简单。

android.os下的FileObserver类是一个用于监听文件访问、创建、修改、删除、移动等操作的监听器,基于linux的inotify。?FileObserver?是个抽象类,必须继承它才能使用。每个FileObserver对象监听一个单独的文件或者文件夹,如果监视的是一个文件夹,那么文件夹下所有的文件和级联子目录的改变都会触发监听的事件。
??? 所能监听的事件类型如下:
??? ACCESS,即文件被访问
??? MODIFY,文件被 修改
??? ATTRIB,文件属性被修改,如 chmod、chown、touch 等
??? CLOSE_WRITE,可写文件被 close
??? CLOSE_NOWRITE,不可写文件被 close
??? OPEN,文件被 open
??? MOVED_FROM,文件被移走,如 mv
??? MOVED_TO,文件被移来,如 mv、cp
??? CREATE,创建新文件
??? DELETE,文件被删除,如 rm
??? DELETE_SELF,自删除,即一个可执行文件在执行时删除自己
??? MOVE_SELF,自移动,即一个可执行文件在执行时移动自己
??? CLOSE,文件被关闭,等同于(IN_CLOSE_WRITE | IN_CLOSE_NOWRITE)
??? ALL_EVENTS,包括上面的所有事件
????? 这些都是FileObserver的静态共有属性。
????? 下面举个例子说明一下其用法。
? ? ? 比如,我要监听sd卡的目录创建事件,新建一个类SDCardListener继承FileObserver:

Java代码??收藏代码
  1. import?android.os.FileObserver;??
  2. import?android.util.Log;??
  3. ??
  4. /**?
  5. ?*?sd卡上的目录创建监听器?
  6. [email protected]?
  7. ?*?
  8. ?*/??
  9. public?class?SDCardListener?extends?FileObserver?{??
  10. ??
  11. ????public?SDCardListener(String?path)?{??
  12. ????????/*?
  13. ?????????*?这种构造方法是默认监听所有事件的,如果使用super(String,int)这种构造方法,?
  14. ?????????*?则int参数是要监听的事件类型.?
  15. ?????????*/??
  16. ????????super(path);??
  17. ????}??
  18. ??
  19. ????@Override??
  20. ????public?void?onEvent(int?event,?String?path)?{?????????
  21. ????????switch(event)?{??
  22. ????????case?FileObserver.ALL_EVENTS:??
  23. ????????????Log.d("all",?"path:"+?path);??
  24. ????????????break;??
  25. ????????case?FileObserver.CREATE:??
  26. ????????????Log.d("Create",?"path:"+?path);??
  27. ????????????break;??
  28. ????????}??
  29. ????}??
  30. }??

??? ?? onEvent是回调,系统监听到事件后会触发此事件,参数event就是上面所说的事件类型,根据类型,我们可以做相应的处理,参数path就是触发事件的目录。

????? 然后使用它:

Java代码??收藏代码
  1. SDCardListener?listener?=?new?SDCardListener("/sdcard");??
  2. //开始监听??
  3. listener.startWatching();??
  4. /*?
  5. *?在这里做一些操作,比如创建目录什么的?
  6. */??
  7. //最后停止监听??
  8. listener.stopWatching();??

?

?? ?? 如果要在onEvent中做较多操作,最好用线程去做?,以免因为阻塞接收不到后面的事件。

?? ???最后补充一点,比较重要?:
?? ?? FileObserver对象必须保持一个引用,确保不被垃圾收集器回收掉,否则就不会触发事件了。

  相关解决方案