Android FileObserver对文件或文件夹监听

Android  代码片段  2021年8月27日 pm6:31发布3年前 (2021)更新 城堡大人
117 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. 2023: C语言之链接属性(0条评论)
  2. 2020: Android startActivity去掉自带的动画效果(0条评论)
  3. 2019: 周作人:苦雨(0条评论)
版权声明 1、 本站名称: 笔友城堡
2、 本站网址: https://www.biumall.com/
3、 本站部分文章来源于网络,仅供学习与参考,如有侵权,请留言

暂无评论

暂无评论...

随机推荐

Android App启动时间检测

前言记录一下App启动优化,方便自己查阅。正文App启动时间检测adb shell am start -W com.biumall.demo/.MainActivity运行结果ThisTime: 最后一个Activity启动时间 [上面指定了是MainActivity启动时间]To...

Android开启Wifi debug调试

前言记录一下开启WiFi debug的方式,记录于此,方便自己查阅。好记性不如烂笔头正文Android 设备开始WiFi调试可以百度[adb wifi apk],网上有很多现成的apk(有广告),前提也是需要root权限的,这里就不多介绍(有兴趣可以看《[代码]开启WiFi调试》)。...

Android的Log等级介绍以及自定义Log工具类

 一:Log等级介绍Android的Log等级通常有五类,按照日志级别由低到高分别是Verbose、Debug、Info、Warning、Error,其对应的log定义在system层。V   :  Verbose就是冗长啰嗦的。通常表达开发调试过程中的一些详细信息,用Log...

jaudiotagger解析ID3信息

前言代码功能:jaudiotagger解析媒体的ID3信息,这里只过滤指定的格式解析,比如MP3、FLAC、WAV、M4A等几种。推荐看修改版《jaudiotagger解析ID3第二版》好记性不如烂笔头正文导入jaudiotagger.jar导入lib库/libs/jaudiot...

[代码片段]GradientTextView渐变的TextView

前言本质上就是通过LinearGradient来实现渐变的正文public class GradientTextView extends androidx.appcompat.widget.AppCompatTextView { public GradientTextView(Context...

《人间值得》前言

大家好,我是中村恒子,今年90岁,从事心理(精神科)医生工作将近70年了。因为是医生,所以和大家一样每天朝九晚五地工作。与其说我仍在工作,倒不如说是被要求工作。说实话,我真心感谢信任我的患者朋友,这样我能在工作中有机会与各种各样的人交流。每个人都会有烦恼,在人世间,我们各有各的烦恼。其中,既有职...