Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/218.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android:FileObserver只监视顶级目录_Android_Android Sdcard_Fileobserver - Fatal编程技术网

Android:FileObserver只监视顶级目录

Android:FileObserver只监视顶级目录,android,android-sdcard,fileobserver,Android,Android Sdcard,Fileobserver,根据文件, "Each FileObserver instance monitors a single file or directory. If a directory is monitored, events will be triggered for all files and subdirectories inside the monitored directory." 我的代码是这样的 FileObserver fobsv = new FileObserver("/mnt/

根据文件,

"Each FileObserver instance monitors a single file or directory. If a directory is monitored, 
events will be triggered for all files and subdirectories inside the monitored directory."
我的代码是这样的

    FileObserver fobsv = new FileObserver("/mnt/sdcard/") {

    @Override
    public void onEvent(int event, String path) {
        System.out.println(event+"    "+path);
    }
    };
    fobsv.startWatching();
但是,只有在/mnt/sdcard/中的文件发生更改时才会触发
onEvent()
。如果我在/mnt/sdcard/downloads/中创建一个文件,则不会触发该方法

代码有问题吗

根据文件

文档不正确,如中所述

代码有问题吗


不,但是
FileObserver
不是递归的,尽管文档与此相反。

有一个开源的
RecursiveFileObserver
,它的工作原理与普通的
FileObserver
一样。。。我目前正在使用它,它就是它的名称,它作为一个FileObserver,对您选择的目录下的所有目录都是递归的

这是:

public class RecursiveFileObserver extends FileObserver {

public static int CHANGES_ONLY = CLOSE_WRITE | MOVE_SELF | MOVED_FROM;

List<SingleFileObserver> mObservers;
String mPath;
int mMask;

public RecursiveFileObserver(String path) {
    this(path, ALL_EVENTS);
}

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.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) {

}

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;
        RecursiveFileObserver.this.onEvent(event, newPath);
    } 

}
}
公共类递归FileObserver扩展FileObserver{
public static int CHANGES_ONLY=CLOSE_WRITE | MOVE_SELF | MOVED_FROM;
列出移动服务器;
字符串mPath;
国际mMask;
公共递归FileObserver(字符串路径){
这(路径、所有事件);
}
公共递归FileObserver(字符串路径,整数掩码){
超级(路径、掩码);
mPath=路径;
mMask=掩模;
}
@凌驾
公共无效开始匹配(){
if(mObservers!=null)返回;
mObservers=newarraylist();
堆栈=新堆栈();
堆栈推送(mPath);
而(!stack.empty()){
字符串parent=stack.pop();
添加(新的SingleFileObserver(父,mMask));
文件路径=新文件(父级);
File[]files=path.listFiles();
如果(files==null)继续;
对于(int i=0;i
在你的应用程序中创建一个新类,并将此代码复制到其中,然后随心所欲地使用它!
如果你觉得这有帮助,请投票

仅供参考,上面引用的文档不再像它曾经错误地提到的那样提到递归,不过如果它明确表示它不是递归的,那就好了——底层inotify的Linux手册页在最后添加了一个注释。如果我想监视分区的存储更改呢?有办法吗?请注意:这不是完全递归的,因为它不会自动开始监视任何新创建的文件夹,也不会停止监视从树中移出的文件夹。。。由于这是许可的GPLv2,任何基于当前实现解决这些问题的人都应该共享代码。我使用了该代码,它说“如果不调用Looper.create(),则无法在线程中创建处理程序”:/请信任/引用原始源代码,我认为是:@yoav feuerstein,只是一句话:不知道为什么在这个答案中省略了原始的包声明(不幸的是,导入声明也被省略了)。然而,这个类似乎是从
com.owncloud.android.utils
借用来的,正如这里提到的这个类所指出的。代码的相似性似乎比要点更高。