Reputation: 2614
In my Android app I want to detect events from directory. Here is code:
String path = Environment.getExternalStorageDirectory()
+ File.separator + "test2";
Log.d("test", "path is " + path);
FileObserver fileObserver = new FileObserver(path, FileObserver.ALL_EVENTS) {
@Override
public void onEvent(int event, String path) {
Log.d("test", "event dectect " + event + " " + path);
}
};
fileObserver.startWatching();
I copy new file to the directory. But I don't get any event. Please show me where I made a mistake.
Upvotes: 3
Views: 6494
Reputation: 436
Expanding on @user3219477's answer be sure to go in to Settings->Apps->YourApp and grant Storage permission if you aren't requesting it dynamically in your app.
Upvotes: 0
Reputation: 1163
It seems that FileObserver does not work on symbolic links, which is what is returned by Environment.getExternalStorage().
The trick for me was to resolve the links using File.getCanonicalPath()
Example:
File file = new File(Environment.getExteranlStorage(), "myfile");
new FileObserver(file.getCanonicalPath()) ...
Upvotes: 0
Reputation: 8211
You cannot use a local variable to store your FileObserver, it would be available for garbage collection after the method is run.
Warning: If a FileObserver is garbage collected, it will stop sending events. To ensure you keep receiving events, you must keep a reference to the FileObserver instance from some other live object.
Solution: save it to a field.
Upvotes: 18