2011-08-10 33 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); 
     } 
    } 
} 
相关问题