我想观察/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);
}
}
}
递归函数是一个不好的解决方案。因为堆栈和很多东西。 –