前言
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;
}
}
参考文章
历史上的今天
暂无评论...
随机推荐
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...