2011-08-10 32 views
3

我想觀察/sdcard/,如果文件或文件夾複製在/sdcard/或子文件夾/sdcard/我會收到通知。在android中的fileobserver

我嘗試FileObserver但問題是FileObserver只是檢測複製過程將發生在/sdcard/並且它不會通知子文件夾中發生的複製過程。 我應該爲所有的文件夾做一個FileObserver?這是不好的表現。

回答

3

是的,你將不得不爲SD卡中的每個文件夾製作FileObserver對象。隨着它出現的問題,如知道哪個文件夾的onEvent()被稱爲和更新文件夾重命名時更新內部字符串。

Issue 12479已經存在一個關於它的問題。還有一個由同一位開發該問題的人編寫的補丁。我還沒有嘗試過這個補丁,所以無法評論它。

+0

遞歸函數是一個不好的解決方案。因爲堆棧和很多東西。 –

-1

我曾經遇到類似的情況。 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); 
     } 
    } 
} 
相關問題