如何从Android服务实现FileObserver

问题描述:

如何构建Android应用程序以启动Service以使用FileObserver,以便在观察目录被修改时(即用户拍摄照片)执行一些其他代码。调试时,从不触发onEvent方法。如何从Android服务实现FileObserver

这是我在我的服务中的onStart事件。该Toast火的“我的服务开始......”

public final String TAG = "DEBUG"; 
public static FileObserver observer;  

@Override 
public void onStart(Intent intent, int startid) {  
     Log.d(TAG, "onStart"); 

     final String pathToWatch = android.os.Environment.getExternalStorageDirectory().toString() + "/DCIM/Camera/";  
     Toast.makeText(this, "My Service Started and trying to watch " + pathToWatch, Toast.LENGTH_LONG).show(); 

     observer = new FileObserver(pathToWatch) { // set up a file observer to watch this directory on sd card 
      @Override 
      public void onEvent(int event, String file) { 
       //if(event == FileObserver.CREATE && !file.equals(".probe")){ // check if its a "create" and not equal to .probe because thats created every time camera is launched 
        Log.d(TAG, "File created [" + pathToWatch + file + "]"); 

        Toast.makeText(getBaseContext(), file + " was saved!", Toast.LENGTH_LONG);     
       //} 
      } 
     }; 
    } 

但是,敬酒之后,如果我拍照的onEvent永远不会触发。这是通过调试确定的。它从来没有碰到过这个断点,而且吐司从不会开火。

当该目录被浏览时,新的图像被保存在那里。

如何获得FileObserver工作在Service

see此主题。我想你在安装观察员后错过了observer.startWatching()电话。

observer = new FileObserver(pathToWatch) { // set up a file observer to watch this directory on sd card 

    @Override 
    public void onEvent(int event, String file) { 
     //if(event == FileObserver.CREATE && !file.equals(".probe")){ // check if its a "create" and not equal to .probe because thats created every time camera is launched 
     Log.d(TAG, "File created [" + pathToWatch + file + "]"); 

     Toast.makeText(getBaseContext(), file + " was saved!", Toast.LENGTH_LONG).show(); 
     //} 
    } 
}; 
observer.startWatching(); //START OBSERVING 
+4

我会给你贷款的答案目录下的所有目录,因为这可能会解决它基于我的示例代码。我实际上是从你参考的那篇文章中拼凑出我的解决方案,但它仍然无法工作。我可能错过了startWatching()方法,但是对于我来说,解决方案的任何一种方式都是使用此示例:http://www.roman10.net/?p=457 – shanabus

添加.show()toast后,即

Toast.makeText(getBaseContext(), file + " was saved!", toast.LENGTH_LONG).show();     
+0

是的,答案的所有者应该已经编辑它.. – HendraWD

一件事FileObserver不遵守子目录。如果你也想观察分目录请查看this的帖子。

一个开放源码RecursiveFileObserver作为先进FileObserver是递归的为你选择

Click to download file

+0

尽管这个链接可能回答这个问题,但最好在这里包含答案的重要部分,并提供供参考的链接。如果链接页面更改,则仅链接答案可能会失效。 - [来自评论](/评论/低质量帖/ 10535638) – Trilarion

+0

链接页面是*的答案..所以没有必要 –