1

我正在开发一个应用程序,它在设备启动时自动启动,它需要监视设备内存中的一些特殊目录,为此我使用 FileObservers,我的代码片段是:

 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...

当我在运行它的设备的情况下启动此应用程序时,我正在观察的文件夹所在的分区已安装并且我可以对其进行监控,问题是当我重新启动设备时,然后在系统安装之前执行此代码分区并且它不将其识别为文件夹:

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() }但我想问一下是否有更优雅的方式来通知这个应用程序分区已经挂载并且系统准备好了。

如果我在 shell 中执行 mount ,我会得到:

127|root@android:/ # 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(),它是一个修改过的设备,这是一个分区,不能保证是发布版本中的外部存储路径

4

1 回答 1

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));
        }

    }
    }
});

}
于 2014-03-27T09:57:36.117 回答