Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

File Observer is not working from intent service

I've found a great class to extend the abstract File Observer class...

import android.os.FileObserver;
import java.io.DataInputStream; 
import java.io.DataOutputStream; 
import java.io.File; 
import java.io.FileInputStream; 
import java.io.IOException; 
import java.net.HttpURLConnection; 
import java.net.MalformedURLException; 
import java.net.URL; 
import android.util.Log;

public class FileSync extends FileObserver {
public String absolutePath;
public String uid;

public FileSync(String path, String uidd) {
    super(path, FileObserver.ALL_EVENTS);
    absolutePath = path;
    uid = uidd;
}
@Override
public void onEvent(int event, String path) {
    if (path == null) { //path is the name of the file... I think its absolute
        return;
    }
    //a new file or subdirectory was created under the monitored directory
    if ((FileObserver.CREATE & event)!=0) { 
        doFileUpload(path, uid);
    }
    //a file or directory was opened
    if ((FileObserver.OPEN & event)!=0) {
        //TODO Nothing... yet
    }
    //data was read from a file
    if ((FileObserver.ACCESS & event)!=0) {
        //TODO Nothing... yet
    }
    //data was written to a file
    if ((FileObserver.MODIFY & event)!=0) {
        doFileUpload(path,uid);
    }
    //someone has a file or directory open read-only, and closed it
    if ((FileObserver.CLOSE_NOWRITE & event)!=0) {
        //TODO Nothing... yet
    }
    //someone has a file or directory open for writing, and closed it 
    if ((FileObserver.CLOSE_WRITE & event)!=0) {
        doFileUpload(path,uid);
    }
    //[todo: consider combine this one with one below]
    //a file was deleted from the monitored directory
    if ((FileObserver.DELETE & event)!=0) {
        //TODO Remove file from the server
    }
    //the monitored file or directory was deleted, monitoring effectively stops
    if ((FileObserver.DELETE_SELF & event)!=0) {
        //TODO Toast an error, recreate the folder, resync and restart monitoring
    }
    //a file or subdirectory was moved from the monitored directory
    if ((FileObserver.MOVED_FROM & event)!=0) {
        //TODO Delete from the server
    }
    //a file or subdirectory was moved to the monitored directory
    if ((FileObserver.MOVED_TO & event)!=0) {
        doFileUpload(path,uid);
    }
    //the monitored file or directory was moved; monitoring continues
    if ((FileObserver.MOVE_SELF & event)!=0) {
        //TODO Recreate the folder and show toast
    }
    //Metadata (permissions, owner, timestamp) was changed explicitly
    if ((FileObserver.ATTRIB & event)!=0) {
        //TODO Nothing... Yet
    }
}

I create three of these observers in the onCreate of the IntentService like so:

new File("/sdcard/Docs/").mkdir();
FileSync files = new FileSync("/sdcard/Docs/",uid);
FileSync pictures = new FileSync(Environment.DIRECTORY_PICTURES,uid);
FileSync music = new FileSync(Environment.DIRECTORY_MUSIC,uid);
files.startWatching();
pictures.startWatching();
music.startWatching();

Not only are the observers not working, but the mkdir function isn't working.

Any ideas? Thanks!

like image 799
Osmium USA Avatar asked Oct 08 '22 11:10

Osmium USA


1 Answers

check whether you have included android.permission.WRITE_EXTERNAL_STORAGE in your manifest file.
Absence of this permission will led to failure of mkdir() and this will cause FileObserver to fail as well because the monitored file or directory must exist at the time of startWatching else no events will be reported.

like image 146
Eight Avatar answered Oct 12 '22 11:10

Eight