#안드로이드 FileObserver 사용하기
2019. 11. 25. 19:59 ㆍ개발 이야기/android
개발 중에 폰 내부의 특정 디렉터리에 파일이 써지고 지워지는 동작을
확인 후 처리해야할 일이 있었는데
FileObserver라는 것을 이용해서 쉽게 구현할 수 있었다.
설명은 이렇다
파일을 모니터링 ( inotify 사용 )하여 장치의 모든 프로세스 (이 파일 포함)에 의해 파일에 액세스하거나 변경 한 후 이벤트를 발생시킵니다. FileObserver는 추상 클래스입니다. 서브 클래스는 이벤트 핸들러를 구현해야합니다 onEvent(int, java.lang.String).
각 FileObserver 인스턴스는 여러 파일 또는 디렉토리를 모니터 할 수 있습니다. 디렉토리가 모니터되면 모니터 된 디렉토리 내의 모든 파일 및 서브 디렉토리에 대해 이벤트가 트리거됩니다.
이벤트 마스크는보고 할 변경 또는 조치를 지정하는 데 사용됩니다. 이벤트 유형 상수는 이벤트 마스크에서 발생할 수있는 변경 사항과 이벤트 콜백에서 실제로 발생한 사항을 설명하는 데 사용됩니다.
https://developer.android.com/reference/android/os/FileObserver
상태 값은 아래와 같다
구현 방법은 아래와 같이 클래스로 구현해주었다.
(참고: 깃 허브 소스코드)
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(); 을 실행시켜주면 된다!
'개발 이야기 > android' 카테고리의 다른 글
#안드로이드 TextWatcher를 이용한 이메일 형식 체크(email validation) (2) | 2019.12.04 |
---|---|
#안드로이드 FFmpeg 사용하기(64bit 지원) (1) | 2019.12.03 |
#안드로이드 Kotlin 오디오 파일 Duration 가져오기 (0) | 2019.11.23 |
#안드로이드 Third party 로그인 연동 4(페이스북 연동) (0) | 2019.09.15 |
#안드로이드 Third party 로그인 연동 3(파이어베이스 연동) (0) | 2019.09.15 |