0
이상한 질문 일 수 있습니다.하지만 FileObserver를 처음 사용하고 있습니다. 내가 작성한 코드는이벤트가 FileObserver에 의해 트리거되지 않음
public class FileChanges extends FileObserver {
public static int CHANGES_ONLY = CLOSE_WRITE | MOVE_SELF | MOVED_FROM;
List<SingleFileObserver> mObservers;
String mPath;
int mMask;
Context mContext;
public FileChanges(String path, Context mContext) {
this(path, ALL_EVENTS, mContext);
this.mContext = mContext;
}
public FileChanges(String path, int mask, Context mContext) {
super(path, mask);
this.mContext = mContext;
mPath = path;
mMask = mask;
}
@Override
public void startWatching() {
if (mObservers != null)
return;
mObservers = new ArrayList<SingleFileObserver>();
Stack<String> stack = new Stack<String>();
stack.push(mPath);
while (!stack.empty()) {
String parent = stack.pop();
mObservers.add(new SingleFileObserver(parent, mMask));
File path = new File(parent);
File[] files = path.listFiles();
if (files == null)
continue;
for (int i = 0; i < files.length; ++i) {
if (files[i].isDirectory() && !files[i].getName().equals(".")
&& !files[i].getName().equals("..")) {
stack.push(files[i].getPath());
}
}
}
for (int i = 0; i < mObservers.size(); i++)
mObservers.get(i).startWatching();
}
@Override
public void stopWatching() {
if (mObservers == null)
return;
for (int i = 0; i < mObservers.size(); ++i)
mObservers.get(i).stopWatching();
mObservers.clear();
mObservers = null;
}
@Override
public void onEvent(int event, String path) {
if (event == FileObserver.ALL_EVENTS)
Toast.makeText(mContext, "File Event", Toast.LENGTH_SHORT).show();
}
private class SingleFileObserver extends FileObserver {
private String mPath;
public SingleFileObserver(String path, int mask) {
super(path, mask);
mPath = path;
}
@Override
public void onEvent(int event, String path) {
String newPath = mPath + "/" + path;
FileChanges.this.onEvent(event, newPath);
}
}
}
그리고 나중에에서 OnCreate 함수에서 MainActivity에서 나는 아래의 함수를 호출하고 있습니다입니다.
filechanges = new FileChanges(Environment.getExternalStorageDirectory()
.toString(), this);
filechanges.startWatching();
FileObserver가 트리거되지 않는 이유가 없습니다. 나도 하나의 디렉토리를 시도했지만 작동하지 않습니다.