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

}


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值