Android FileObserver对文件或文件夹监听

Android2021年8月27日 pm6:31发布3年前 (2021)更新 3xcn.com@站长
0 0 0
广告也精彩
目录

前言

Android有个抽象类FileObserver,看名字就知道对文件监听。用于监听文件访问、创建、修改、删除、移动等操作的监听。

本文有参考其他文章整理,以及自己亲自写demo验证。

好记性不如烂笔头

正文

FileObserver简介

FileObserver 是个抽象类,需要继承才可以使用。

每个FileObserver对象监听一个单独的文件或者文件夹。

如果监听的是一个文件夹,那么文件夹下所有的文件和文件夹的变化都会触发监听的事件。

FileObserver监听事件

FileObserver.ACCESS,即文件被访问 
FileObserver. MODIFY,文件被 修改 
FileObserver.ATTRIB,文件属性被修改, 
FileObserver.CLOSE_WRITE,可写文件被 close 
FileObserver.CLOSE_NOWRITE,不可写文件被 close 
FileObserver.OPEN,文件被 open 
FileObserver. MOVED_FROM,文件被移走, 
FileObserver.MOVED_TO,文件被移来, 
FileObserver.CREATE,创建新文件 
FileObserver.DELETE,文件被删除, 
FileObserver.DELETE_SELF,自删除,即一个可执行文件在执行时删除自己 
FileObserver. MOVE_SELF,自移动,即一个可执行文件在执行时移动自己 
FileObserver.CLOSE,文件被关闭,等同于(IN_CLOSE_WRITE | IN_CLOSE_NOWRITE) 
FileObserver.ALL_EVENTS,包括上面的所有事件

FileObserver 注释事项

如果你监听一个文件夹(单独文件我没测试),这个目录必须提前存在,要不然没有效果。

比如:

Environment.getExternalStorageDirectory().getPath()+ "/Pictures/Screenshots";

这个是监听截图后存放的目录。

这个目录在截图前是不存在的,如果你在截图前设置了监听,就没法收到监听事件。

PS: 我在的Android 9.0的机器上测试的。

如果需要提前监听,需要判断这个目录是否存在,不存在就需要创建一下。

FileObserver继承

直接上代码

public class FileObserverUtils extends FileObserver {

    public FileObserverUtils(String path) {
        super(path);
    }

    @Override
    public void onEvent(int event, @Nullable String path) {
        switch (event){
            case FileObserver.ACCESS:
                break;
            case FileObserver.MODIFY:
                break;
            case FileObserver.ATTRIB:
                break;
            case FileObserver.CLOSE_WRITE:
                break;
            case FileObserver.CLOSE_NOWRITE:
                break;
            case FileObserver.OPEN:
                break;
            case FileObserver.MOVED_FROM:
                break;
            case FileObserver.MOVED_TO:
                break;
            case FileObserver.CREATE:
                break;
            case FileObserver.DELETE:
                break;
            case FileObserver.DELETE_SELF:
                break;
            case FileObserver.MOVE_SELF:
                break;
        }

    }
}

使用方式

    //设置监听目录以及启动监听
    mFileObserverUtils = new FileObserverUtils("监听的目录");
    mFileObserverUtils.startWatching();
    
    //停止监听
    if (null != mFileObserverUtils) {
        mFileObserverUtils.stopWatching();
    }

由于用的是Android 9.0,我的不是系统应用,除了需要配置AndroidManifest.xml,还需要手动申请权限。

AndroidManifest.xml中的修改

    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>

下面是申请权限的完整代码:

public class AskPermissionUtils {

    /**
     * request permission
     */
    public static final String REQUEST_PERMISSION[] = new String[]{
            Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE
    };

    /**
     * requestCode
     */
    public static final int REQUEST_CODE = 0x1000;


    /**
     * @param activity
     * @return
     */
    public static boolean checkPermissions(Activity activity) {
        if (null == activity) {
            return false;
        }
        List<String> list = new ArrayList<>();
        for (int i = 0; i < REQUEST_PERMISSION.length; i++) {
            if (ContextCompat.checkSelfPermission(activity, REQUEST_PERMISSION[i]) != PackageManager.PERMISSION_GRANTED) {
                list.add(REQUEST_PERMISSION[i]);
            }
        }
        if (list.size() > 0) {
            requestPermissions(activity, list.toArray(new String[list.size()]), REQUEST_CODE);
            return false;
        }
        return true;
    }


    /**
     * 动态申请权限
     *
     * @param activity
     * @param permissions
     * @param requestCode
     */
    public static void requestPermissions(Activity activity, String[] permissions, final int requestCode) {
        if (null == activity) {
            return;
        }
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            ActivityCompat.requestPermissions(activity, permissions, requestCode);
        }
        return;
    }

}

参考文章

  1. Android FileObserver对文件或文件夹监听
  2. FileObserver文件监听

 历史上的今天

版权声明 1、 本站名称: 91易搜
2、 本站网址: 91es.com3xcn.com
3、 本站文章: 部分来源于网络,仅供站长学习和参考,若侵权请留言
广告也精彩

相关文章

广告也精彩

暂无评论

评论审核已启用。您的评论可能需要一段时间后才能被显示。

暂无评论...

网站升级中

公告

近期网站升级中,可能存在一些bug。欢迎反馈 https://www.91es.com/we.html

本站域名

本站域名 : 91es.com3xcn.com。本站邮箱 : 站长邮箱 i@oorr.cn,通知邮箱we@oorr.cn ,如有更新,请看公告 。