Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/189.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.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 我发现了一些奇怪的事情_Android - Fatal编程技术网

Android 我发现了一些奇怪的事情

Android 我发现了一些奇怪的事情,android,Android,好的,这很简单:我有一个FileObserver类来观察包含音乐的文件夹。所以我实现了OneEvent和所有这些东西,但当我使用文件管理器在该文件夹上移动或粘贴文件时,而不是使用FileObserver.MOVED_TO或FileObserver.CREATE,我得到的是数字为1073741656的奇怪事件,这些事件没有记录在: 那么,我如何获得这些特定事件,如删除、移动、创建和粘贴 [编辑] 代码如下: private class MusicsFileObserver extends Fi

好的,这很简单:我有一个FileObserver类来观察包含音乐的文件夹。所以我实现了OneEvent和所有这些东西,但当我使用文件管理器在该文件夹上移动或粘贴文件时,而不是使用FileObserver.MOVED_TO或FileObserver.CREATE,我得到的是数字为1073741656的奇怪事件,这些事件没有记录在:

那么,我如何获得这些特定事件,如删除、移动、创建和粘贴

[编辑] 代码如下:

 private class MusicsFileObserver extends FileObserver {

    public MusicsFileObserver(String root) {
        super(root);

        if (!root.endsWith(File.separator)) {
            root += File.separator;
        }
    }

    @SuppressWarnings("unused")
    public void close() {
        super.finalize();
    }

    public void onEvent(final int event, String path) {
      //here is the problem, if you see the documentation, when a file is moved 
      //to this directory, event should be equal to FileObserver.MOVED_TO, 
      //a constant value of 128. But when debugging, instead of entering here one time
      //with event == 128, this method onEvent is being called 4~5 times with event
      //with numbers like 1073741656
        if (event != FileObserver.ACCESS || event != FileObserver.OPEN || event != 32768)
            runOnUiThread(new Runnable() {
                public void run() {
                    rescanMusics();
                }
            });
    }
}

对于其他遇到此问题的人,我发现MOVED_TO和MOVED_FROM事件在事件标志中启用了高阶位。从is 0x40000040移动到is 0x40000080。解决方法是使用事件代码简单地“和”所有_事件以关闭高位,即“event&=FileObserver.ALL_EVENTS”


更新:我找到了您可以从中获取的inotify标志,如果google将这些位标志添加到FileObserver文档中,那就太好了。

观察者事件类型如下:

public void onEvent(int event) {
      if ((FileObserver.CREATE & event)!=0) {
        // do what ever you want.
      } else if ((FileObserver.MODIFY & event)!=0) {
        // do what ever you want.           
      } ...... etc
}

尝试在应用程序类中将引用链接到Observer。 像这样

private ArrayList<FileObserver> mObservers = new ArrayList<FileObserver>();

public void addObserver(FileObserver observer){
    mObservers.add(observer);
}

public void removeObserver(FileObserver observer){
    mObservers.remove(observer);
}
private ArrayList mObservers=new ArrayList();
public void addObserver(FileObserver){
mObservers.add(observer);
}
public void removeObserver(FileObserver){
mObservers.remove(观察者);
}

这对我有用

如果有其他人来自谷歌,请注意以下方面:

startWatching() 开始关注事件。此时必须存在受监视的文件或目录,否则不会报告任何事件 (即使它稍后出现)。如果已启动监视,则此 这个电话无效


你能发布一些你的代码,并用一些关于问题发生地点的注释对其进行注释吗?用一段代码编辑你是否在你认为你所在的目录中?您的构造函数中的if签入当前未执行任何操作。如果在传入的根字符串末尾没有File.spearator,它将保持这种方式,这意味着它正在查找一个文件而不是一个目录…嗯,既然你说了,我正在将一个文件移动到我正在观察的目录的子文件夹中。。我将测试当我将它粘贴到目录上时得到的事件,它自己找到了一种工作方式。我没有检查int“event”,而是检查字符串路径,因为当有人删除、复制、移动和弄乱文件时,它总是返回文件的路径。这是所有事件的真实路径还是仅仅移动到和移动到?您提供的链接已失效。这个评论很长,因为。。。所以,谢谢。这很有帮助,但它确实提出了一个问题,即如何监视特定文件的创建。。。当CREATE是允许作为参数的事件类型之一时。。