遇见的坑:
1.注册OPEN事件在某些手机不生效
原因:某些手机回调没有OPEN事件
解决: 可以注册 ACCESS 代替 OPEN
2.注册ALL_EVENTS 不生效
原因:某版本手机访问sd卡权限有三种状态 拒绝,询问,
解决:设为允许 ,部分手机默认安转为询问
3.以下是所有事件
ACCESS 访问文件
MODIFY 修改文件
ATTRIB 修改文件属性,例如chmod 、chown等
CLOSE_WRITE以可写属性打开的文件被关闭
CLOSE_NOWRITE 以不可写属性被打开的文件被关闭
OPEN 文件被打开
MOVED_FROM 文件被移走,例如mv
MOVED_TO 移入新文件,例如mv cp
CREATE 创建新文件
DELETE 删除文件,例如rm
DELETE_SELF 自删除,一个文件在执行时删除自己
MOVE_SELF 自移动,一个可执行文件在执行时移动自己
CLOSE 关闭文件 = (IN_CLOSE_WRITE | IN_CLOSE_NOWRITE)
ALL_EVENTS 上面所有的事件
ATTRIB 修改文件属性,例如chmod 、chown等
CLOSE_WRITE以可写属性打开的文件被关闭
CLOSE_NOWRITE 以不可写属性被打开的文件被关闭
OPEN 文件被打开
MOVED_FROM 文件被移走,例如mv
MOVED_TO 移入新文件,例如mv cp
CREATE 创建新文件
DELETE 删除文件,例如rm
DELETE_SELF 自删除,一个文件在执行时删除自己
MOVE_SELF 自移动,一个可执行文件在执行时移动自己
CLOSE 关闭文件 = (IN_CLOSE_WRITE | IN_CLOSE_NOWRITE)
ALL_EVENTS 上面所有的事件
4.以下是检测一次性测试用例
public class MainActivity extends Activity { private static final String TAG = "MainActivity2"; private FileObserver mFileObserver; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); findViewById(R.id.test).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { startObserving(); } }); } private void startObserving() { int eventMask = FileObserver.ALL_EVENTS; String rootPath = Environment.getExternalStorageDirectory().getPath(); File file = new File(rootPath, "test23.txt"); Log.e(TAG, "file.exists():" + file.exists()); if (!file.exists()){ try { file.createNewFile(); } catch (IOException e) { e.printStackTrace(); } } Log.e(TAG, file.getAbsolutePath()); mFileObserver = new FileObserver(file.getAbsolutePath(), eventMask) { @Override public void onEvent(int event, String path) { // Filter out the undocumented IN_IGNORED (32768) event: // https://code.google.com/p/android/issues/detail?id=29546&q=FileObserver&colspec=ID%20Type%20Status%20Owner%20Summary%20Stars Log.e(TAG, "event :" + event + " path: " + path); final int FILE_IGNORED = 0x8000; if ((event & FILE_IGNORED) != 0) { return; } // Workaround for a bug in FileObserver: // The high-order bits of event may be set for some event types. // So, make sure those bits are cleared before looking at the event type. } }; mFileObserver.startWatching(); Log.e(TAG, "mFileObserver:" + mFileObserver); } private void stopObserving() { if (mFileObserver != null) { mFileObserver.stopWatching(); mFileObserver = null; } } }