我想觀察/sdcard/
,如果文件或文件夾複製在/sdcard/
或子文件夾/sdcard/
我會收到通知。在android中的fileobserver
我嘗試FileObserver但問題是FileObserver
只是檢測複製過程將發生在/sdcard/
並且它不會通知子文件夾中發生的複製過程。 我應該爲所有的文件夾做一個FileObserver
?這是不好的表現。
我想觀察/sdcard/
,如果文件或文件夾複製在/sdcard/
或子文件夾/sdcard/
我會收到通知。在android中的fileobserver
我嘗試FileObserver但問題是FileObserver
只是檢測複製過程將發生在/sdcard/
並且它不會通知子文件夾中發生的複製過程。 我應該爲所有的文件夾做一個FileObserver
?這是不好的表現。
是的,你將不得不爲SD卡中的每個文件夾製作FileObserver
對象。隨着它出現的問題,如知道哪個文件夾的onEvent()
被稱爲和更新文件夾重命名時更新內部字符串。
在Issue 12479已經存在一個關於它的問題。還有一個由同一位開發該問題的人編寫的補丁。我還沒有嘗試過這個補丁,所以無法評論它。
我曾經遇到類似的情況。 google中的FileObserver Doc確實說過,一旦你爲父文件夾設置了監聽器,它就可以通知所有子文件夾中的更改,但它不會以這種方式工作。一些StackOverflowers建議使用開源的FileObserver,我也是如此,並且完美的工作。這裏是代碼..
public class RecursiveFileObserver extends FileObserver
{
public static final int CHANGES_ONLY = CREATE | DELETE | CLOSE_WRITE | MOVE_SELF | MOVED_FROM | MOVED_TO;
List<SingleFileObserver> mObservers;
String mPath;
int mMask;
public String directoryPath;
public RecursiveFileObserver(String path) {
this(path, ALL_EVENTS);
directoryPath = path;
}
public RecursiveFileObserver(String path, int mask) {
super(path, mask);
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.isEmpty()) {
String parent = stack.pop();
mObservers.add(new SingleFileObserver(parent, mMask));
File path = new File(parent);
File[] files = path.listFiles();
if (null == files) continue;
for (File f : files)
{
if (f.isDirectory() && !f.getName().equals(".") && !f.getName().equals("..")) {
stack.push(f.getPath());
}
}
}
for (SingleFileObserver sfo : mObservers) {
sfo.startWatching();
}
}
@Override
public void stopWatching() {
if (mObservers == null) return;
for (SingleFileObserver sfo : mObservers) {
sfo.stopWatching();
}
mObservers.clear();
mObservers = null;
}
@Override
public void onEvent(int event, String filePath)
{
event &= FileObserver.ALL_EVENTS;
synchronized (this)
{
//Log.i("FileManager", "event occured:"+filePath);
if (event == FileObserver.CREATE || event == FileObserver.MOVED_TO)
{
return;
}
if (event == FileObserver.DELETE || event == FileObserver.MOVED_FROM)
{
return;
}
}
}
class SingleFileObserver extends FileObserver
{
String mPath;
public SingleFileObserver(String path) {
this(path, ALL_EVENTS);
mPath = path;
}
public SingleFileObserver(String path, int mask) {
super(path, mask);
mPath = path;
}
@Override
public void onEvent(int event, String path) {
String newPath = mPath + "/" + path;
RecursiveFileObserver.this.onEvent(event, newPath);
}
}
}
遞歸函數是一個不好的解決方案。因爲堆棧和很多東西。 –