前言
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 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年了。因为是医生,所以和大家一样每天朝九晚五地工作。与其说我仍在工作,倒不如说是被要求工作。说实话,我真心感谢信任我的患者朋友,这样我能在工作中有机会与各种各样的人交流。每个人都会有烦恼,在人世间,我们各有各的烦恼。其中,既有职...