FileObserver使用

ContentObserver可以监听不同程序间指定uri或者cursor内容的变化,如果两个无网络连接的设备通过OTG线相连,并且两设备可以通过U盘路径的方式相互访问存储,那么两设备的不同应用通信可以尝试通过FileObserver或者ContentObserver来进行,本文主要讲解FileObserver。

FileObserver是一个抽象类,可以创建FileObserver一个子类并且重写onEvent抽象方法来实现功能逻辑。

android10(sdk版本29)之前,FileObserver有两个构造函数

public FileObserver(String path) {
    this(path, ALL_EVENTS);
}
public FileObserver(String path, int mask) {
    m_path = path;
    m_mask = mask;
    m_descriptor = -1;
}

android10开始,上面有路径参数的构造函数被废弃掉,新增了以文件和文件集合为参数的构造方法。这里需要区分当前设备版本去有效的调用路径或者文件的构造函数,否则低版本找不到相应的构造函数导致应用挂掉。

public FileObserver(@NonNull File file, @NotifyEventType int mask) {
    this(Arrays.asList(file), mask);
}
public FileObserver(@NonNull List<File> files, @NotifyEventType int mask) {
    mFiles = files;
    mMask = mask;
}

实例代码:

public class MyFileObserver extends FileObserver {
    private static final String TAG  = "MyFileObserverLog";
    public MyFileObserver(File file) {
        super(file.getAbsolutePath(), FileObserver.ALL_EVENTS);
        Log.d(TAG, "MyFileObserver: "+file.getAbsolutePath()+",,"+FileObserver.ALL_EVENTS);
    }

    @Override
    public void onEvent(int event,  String path) {
      Log.d(TAG, "onEvent path:"+ path+",event="+event);
      switch (event){
          case FileObserver.CREATE:
              break;
      }
    }
}

public class MainActivity extends AppCompatActivity {
    MyFileObserver myFileObserver;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        if (checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE)!= PackageManager.PERMISSION_GRANTED) {
            requestPermissions(new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},22);
        }
        myFileObserver=new MyFileObserver(new File("/sdcard/test.txt")) ;
        myFileObserver.startWatching();
        FileProvider.getUriForFile()
    }
    @Override
    protected void onDestroy() {
        myFileObserver.stopWatching();
        super.onDestroy();
    }
}

修改文件内容,log打印如下,可以过滤对自己有用的event即可

2020-04-03 18:24:11.977 6173-6209/com.adups.myapplication D/MyFileObserverLog: onEvent path:null,event=2
2020-04-03 18:24:11.977 6173-6209/com.adups.myapplication D/MyFileObserverLog: onEvent path:null,event=32
2020-04-03 18:24:12.040 6173-6209/com.adups.myapplication D/MyFileObserverLog: onEvent path:null,event=2
2020-04-03 18:24:12.043 6173-6209/com.adups.myapplication D/MyFileObserverLog: onEvent path:null,event=2
2020-04-03 18:24:12.046 6173-6209/com.adups.myapplication D/MyFileObserverLog: onEvent path:null,event=8

上面日志对应id

public static final int MODIFY = 0x00000002;
public static final int OPEN = 0x00000020;
public static final int CLOSE_WRITE = 0x00000008;

谷歌推荐为了保证FileObserver不被垃圾回收,最好将FileObserver保定在一个长生命周期对象上,比如sevice,或者Application。

猜你喜欢

转载自blog.csdn.net/u013795543/article/details/105299307