FileObserver的使用以及遇见的坑



遇见的坑: 

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 上面所有的事件


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;
        }
    }

}


你可能感兴趣的:(anroid)