1. 程式人生 > >Android 監聽文件夾

Android 監聽文件夾

external 分享 tex xtend 目錄 nac 觸發 改變 @override

在一次Androidpc端的通訊過程中,我們放棄了adb forward來實現socket通訊。而是使用adb push文件,我監聽文件夾... 都學習一下很有必要

本篇簡單Android監聽文件夾的方式FileObserver

FileObserver簡介

Android.os包下的FileObserver類是一個用於監聽文件訪問、創建、修改、刪除、移動等操作的監聽器,基於LinuxINotify

FileObserver是個抽象類,必須繼承它才能使用。每個FileObserver對象監聽一個單獨的文件或者文件夾,如果監視的是一個文件夾,那麽文件夾下所有的文件和級聯子目錄的改變都會觸發監聽的事件。

FileObserver使用


package com.example.chenjy.chenjy;

import android.os.FileObserver;

import utils.LogUtil;

/**
 * Created by chenjy on 2017/5/2.
 */

public class FileListener extends FileObserver {

    private EventCallback callback;

    public FileListener(String path) {
        super(path);
    }

    public void setEventCallback(EventCallback callback){
        this.callback = callback;
    }

    @Override
    public void onEvent(int event, String path) {
        LogUtil.i("FileListener", "path="+path);
        switch (event){
            // 文件被訪問
            case FileObserver.ACCESS:
                LogUtil.i("FileListener", "ACCESS");
                break;
            // 文件被修改
            case FileObserver.MODIFY:
                LogUtil.i("FileListener", "MODIFY");
                break;
            // 文件屬性被修改
            case FileObserver.ATTRIB:
                LogUtil.i("FileListener", "ATTRIB");
                break;
            // 可寫文件被close
            case FileObserver.CLOSE_WRITE:
                LogUtil.i("FileListener", "CLOSE_WRITE");
                if(callback != null){
                    callback.onEvent(path);
                }
                break;
            // 不可寫文件被close
            case FileObserver.CLOSE_NOWRITE:
                LogUtil.i("FileListener", "CLOSE_NOWRITE");
                break;
            // 文件被打開
            case FileObserver.OPEN:
                LogUtil.i("FileListener", "OPEN");
                break;
            // 文件被移走
            case FileObserver.MOVED_FROM:
                LogUtil.i("FileListener", "MOVED_FROM");
                break;
            // 文件被移進來
            case FileObserver.MOVED_TO:
                LogUtil.i("FileListener", "MOVED_TO");
                break;
            // 文件被刪除
            case FileObserver.DELETE:
                LogUtil.i("FileListener", "DELETE");
                break;
            // 創建新文件
            case FileObserver.CREATE:
                LogUtil.i("FileListener", "CREATE");
                break;
            // 自刪除
            case FileObserver.DELETE_SELF:
                LogUtil.i("FileListener", "DELETE_SELF");
                break;
            // 自移動
            case FileObserver.MOVE_SELF:
                LogUtil.i("FileListener", "MOVE_SELF");
                break;
        }
    }

    public interface EventCallback{
        void onEvent(String path);
    }
}

FileObserver調用


package com.example.chenjy.chenjy;

import android.app.Activity;
import android.os.Bundle;
import android.os.Environment;

public class MainActivity extends Activity {

    public static final String FILE_PATH = Environment.getExternalStorageDirectory().getAbsolutePath()+"/Pictures";


    private FileListener fileListener = new FileListener(FILE_PATH);

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        fileListener.startWatching();

    }

}

運行app

技術分享圖片

然後通過adb pushandroid 設備push圖片。

技術分享圖片

技術分享圖片

技術分享圖片

Android 監聽文件夾