Элегантный способ использования Android FileObserver при загрузке устройства

Я разрабатываю приложение, которое запускается автоматически при загрузке устройства, и ему необходимо отслеживать некоторые специальные каталоги в памяти устройства, для этого я использую 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() } но хочу спросить, есть ли более изящный способ уведомить это приложение о том, что разделы уже смонтированы и система готова.

Что у меня есть, если я выполняю 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

Спасибо

EDIT Я забыл сказать, я не могу использовать Environment.getExternalStorage() для этого, это модифицированное устройство, и это раздел, который не гарантируется как внешний путь хранения в версии выпуска


person Guillermo Merino    schedule 26.03.2014    source источник
comment
Элегантные решения и Android несовместимы...   -  person m0skit0    schedule 26.03.2014


Ответы (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));
        }

    }
    }
});

}
person Guillermo Merino    schedule 27.03.2014