#안드로이드 FileObserver 사용하기

2019. 11. 25. 19:59 개발 이야기/android

 

 

개발 중에 폰 내부의 특정 디렉터리에 파일이 써지고 지워지는 동작

 

확인 후 처리해야할 일이 있었는데

 

FileObserver라는 것을 이용해서 쉽게 구현할 수 있었다.

 

설명은 이렇다 


파일을 모니터링 ( inotify 사용 )하여 장치의 모든 프로세스 (이 파일 포함)에 의해 파일에 액세스하거나 변경 한 후 이벤트를 발생시킵니다. FileObserver는 추상 클래스입니다. 서브 클래스는 이벤트 핸들러를 구현해야합니다 onEvent(int, java.lang.String).

각 FileObserver 인스턴스는 여러 파일 또는 디렉토리를 모니터 할 수 있습니다. 디렉토리가 모니터되면 모니터 된 디렉토리 내의 모든 파일 및 서브 디렉토리에 대해 이벤트가 트리거됩니다.

이벤트 마스크는보고 할 변경 또는 조치를 지정하는 데 사용됩니다. 이벤트 유형 상수는 이벤트 마스크에서 발생할 수있는 변경 사항과 이벤트 콜백에서 실제로 발생한 사항을 설명하는 데 사용됩니다.

https://developer.android.com/reference/android/os/FileObserver


 

상태 값은 아래와 같다

https://developer.android.com/reference/android/os/FileObserver.html

 

구현 방법은 아래와 같이 클래스로 구현해주었다.

(참고: 깃 허브 소스코드)

public class FileObserver extends android.os.FileObserver {
    private static final String TAG = "FILEOBSERVER";
    /**
     * should be ends with "/"
     */
    private String rootPath;
    private static final int mask = (FileObserver.CREATE |
            FileObserver.DELETE |
            FileObserver.DELETE_SELF |
            FileObserver.MODIFY |
            FileObserver.MOVED_FROM |
            FileObserver.MOVED_TO |
            FileObserver.MOVE_SELF);

    FileObserver(String root) {
        super(root, mask);
        Log.e(TAG, root);

        if (!root.endsWith(File.separator)) {
            root += File.separator;
        }
        rootPath = root;
    }

    public void onEvent(int event, String path) {
        Log.d(TAG, "동작");
        switch (event) {
            case FileObserver.CREATE:
                Log.d(TAG, "CREATE:" + rootPath + path);
                break;
            case FileObserver.DELETE:
                Log.d(TAG, "DELETE:" + rootPath + path);
                break;
            case FileObserver.DELETE_SELF:
                Log.d(TAG, "DELETE_SELF:" + rootPath + path);
                break;
            case FileObserver.MODIFY:
                Log.d(TAG, "MODIFY:" + rootPath + path);
                break;
            case FileObserver.MOVED_FROM:
                Log.d(TAG, "MOVED_FROM:" + rootPath + path);
                break;
            case FileObserver.MOVED_TO:
                Log.d(TAG, "MOVED_TO:" + path);
                break;
            case FileObserver.MOVE_SELF:
                Log.d(TAG, "MOVE_SELF:" + path);
                break;
            default:
                // just ignore
                break;
        }
    }

    public void close() {
        super.finalize();
    }
}

 

메인 액티비티에서 사용 예

        FileObserver fileObserver = new FileObserver(Environment.getExternalStorageDirectory().getAbsolutePath() + "/Call/");
        fileObserver.startWatching();
       

 

 

위와 같이 startWatching(); 을 해주어야 실행이 되며 

옵저버 기능을 종료하기 위해서는 stopWatching(); 을 실행시켜주면 된다!