I'm developing an application which starts automatically when the device boots and it needs to monitorize some special directories in the memory of the device, for this I use FileObservers, a snippet of my code is:
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...
When I launch this application with the device running it works, the partition where is the folder that I'm observing is mounted and I can monitorize it, the problem is when I reboot the device, then this code is executed before the system mounts the partition and it doesn't recognize it as a folder:
com.mycompany.android.helpers.util.FailedExecutionException: FolderLimit should be checked on directories, /mnt/sdcard1/mycompany/photo/white_list is not a directory
Of course I can do some kind of while(!created){ attempt() }
but I want to ask if there is a more elegant way to notify this application that the partitions are already mounted and the system is ready.
What I have if I execute mount in the shell is:
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
Thank you
EDIT I forgot to say, I can't use Environment.getExternalStorage() for this, it is a modified device and this is a partition which is not guaranteed to be the external storage path in the release version
Finally I did this by brute force...
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));
}
}
}
});
}