2014-03-26 15 views
1

我开发时,设备启动,它需要monitorize一些特殊的目录,在设备的内存,为了这个,我用FileObservers自动启动应用程序时,一个片段我的代码是:优雅的方式来使用Android FileObserver在引导设备

if (folder == null) 
    throw new FailedExecutionException(
      "Trying to check the limit of a null directory"); 

Log.d(TAG, "Setting a limit for " + folder.getAbsolutePath()); 

if (!folder.isDirectory()) 
    throw new FailedExecutionException(
      "FolderLimit should be checked on directories, " 
        + folder.getAbsolutePath() + " is not a directory"); 

    //Then create the FileObserver... 

当我启动与设备此应用程序运行它的工作原理,所在的分区是我观察安装,我可以monitorize的文件夹,问题是,当我重新启动设备,则此代码在系统装入分区之前执行,并且不会将其识别为文件夹:

com.mycompany.android.helpers.util.FailedExecutionException: FolderLimit should be checked on directories, /mnt/sdcard1/mycompany/photo/white_list is not a directory 

我当然可以做某种while(!created){ attempt() }但我要问,如果有一个更优雅的方式来通知分区已经安装该应用程序,系统已准备就绪。

我有什么,如果我执行安装在外壳:

127|[email protected]:/ # mount | busybox grep sdcard1        
/dev/block/vold/179:4 /mnt/sdcard1 vfat  rw,dirsync,nosuid,nodev,noexec,relatime,uid=1000,gid=1015,fmask=0702,dmask=0702,allow_utime= 0020,codepage=cp437,iocharset=iso8859-1,shortname=mixed,utf8,errors=remount-ro 0 0 
tmpfs /mnt/sdcard1/.android_secure tmpfs ro,relatime,size=0k,mode=000 0 0 

谢谢

编辑我忘了说,我不能为此使用Environment.getExternalStorage()它是一个修改的设备,这是一个分区,不保证是发布版本中的外部存储路径

+2

优雅的解决方案和Android不混合... – m0skit0

回答

1

最后我用蛮力做了这个...

private void attemptToCreateFolderLimit(final File file, 
    final long limitCount, final long recycle) { 

ThreadFactory.startNewThread(TAG, new Runnable() { 

    @Override 
    public void run() { 
    for (int i = 0; i < FOLDER_LIMIT_CREATION_ATTEMPTS; i++) { 
     Log.d(TAG, 
      "creating folder limit for " 
       + file.getAbsoluteFile()); 

     try { 
     FolderLimit limit = new FolderLimit(file, limitCount, 
      recycle); 
     folderLimits.add(limit); 
     } catch (FailedExecutionException e) { 
     Log.e(TAG, "Limit not created"); 
     Log.e(TAG, Log.getStackTraceString(e)); 
     } 
     try { 
     Thread.sleep(FOLDER_LIMIT_TIME_BETWEEN_ATTEMPTS); 
     } catch (InterruptedException e) { 
     Log.e(TAG, Log.getStackTraceString(e)); 
     } 

    } 
    } 
}); 

}