Android FileObserver对文件或文件夹监听

Android  代码片段  2021年8月27日 pm6:31发布3年前 (2021)更新 91es.com站长
73 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、 本站名称: 91易搜
2、 本站网址: 91es.com3xcn.com
3、 本站内容: 部分来源于网络,仅供学习和参考,若侵权请留言
3、 本站申明: 个人流水账日记,内容并不保证有效

暂无评论

暂无评论...

随机推荐

Android设备,当旋转旋钮时布局被绿色边框问题

前言部分Android设备是存在旋钮功能,大多是发送的是KeyEvent.KEYCODE_DPAD_UP和KeyEvent.KEYCODE_DPAD_DOWN。 /** Key code constant: Directional Pad Up key. * May also ...

Android刷新媒体库的方法

前言记录一下Android中如何通知扫描文件,也就是把新创建的媒体文件添加到MediaProvider中。这里简单介绍一下个人常用的几种方式。正文方式一发送广播,Intent.ACTION_MEDIA_SCANNER_SCAN_FILE是Android定义的广播。private voi...

朱光潜:像个大人一样生存,像个孩子一样生活

人生是多方面而却相互和谐的整体,把它分析开来看,我们说某部分是实用的活动,某部分是科学的活动,某部分是美感的活动,为正名析理起见,原应有此分别;但是我们不要忘记,完满的人生见于这三种活动的平均发展,它们虽是可分别的却不是互相冲突的。“实际人生”比整个人生的意义较为狭窄。一般人的错误在把它们认为相等,...

Kotlin变量的类型转换简介

前言简单记录一下Kotlin中变量类型的转换,记录于此,方便自己查阅。正文如果将一种数据类型的值赋给另一种不同的数据类型的变量时,则需要进行数据类型转换。根据转换方式的不同,数据类型转换可分为两种:智能类型转换和强制类型转换。类型检查在类型转换前,为了避免异常,可以通过is来进行类型检...

Android String占位格式化

前言记录一下Android中String的占位。其实就是让指定内容固定占用多少个位置,主要是为了美化显示。简单记录一下,方便自己查阅。正文比如,下面打印是不够美观的[1][100]下面是比较好看的(美化后)[ 1][100]或[001][100]这样就占的宽度一样,看起...

《MySQL基础教程》笔记1

前言学习一下MySQL,之前一直没有系统的学习一下。最近有空,看了《MySQL基础教程-西泽梦路》,简单的做一下笔记。记录于此,方便自己回忆。正文我这以Window版的phpstudy软件验证。需要进入这个目录,才可以使用mysql命令D:\phpstudy_pro\Extension...