5

I am trying to save some files on micro SDCard. To check the availability of SDCard, I am using the following method;

private boolean isSdCardReady() {
    Enumeration e = FileSystemRegistry.listRoots();

    while (e.hasMoreElements()) {
        if (e.nextElement().toString().equalsIgnoreCase("sdcard/")) {    
            return true;
        }
    }
    return false;
}

Even if this method returns true, when I try to save files, it gives exception net.rim.device.api.io.file.FileIOException: File system is not ready.

What does this means? If SDCard is not available, then why its listed in FileSystemRegistry.listRoots()?

How can I make sure that SDCard is available for writing?

My development environment:

  • BlackBerry JDE Eclipse Plugin 1.5.0
  • BlackBerry OS 4.5
  • BlackBerry Bold with a 3G card
Mudassir
  • 13,962
  • 8
  • 60
  • 85

2 Answers2

4
  1. Usually I had this error when I tried to access SD card on device restart. You have to postpone all operations in app until startup finished:

    while (ApplicationManager.getApplicationManager().inStartup()) {
        try {
            Thread.sleep(500);
        } catch (InterruptedException ignored) {
        }
    }
    
  2. I remember one more possible cause mentioned here. You have to close all streams after using.

Eugen Martynov
  • 18,698
  • 8
  • 53
  • 105
3

Solved the problem. I was looking for "sdcard" while rootsEnum.nextElement().toString(); returns "SDCard". Yeah, its case sensitive. Now, instead of using hard-coded "SDCard", I've changed the above method to the following;

private static String getSdCardRootDir() {
    Enumeration rootsEnum = FileSystemRegistry.listRoots();

    while (rootsEnum.hasMoreElements()) {

        String rootDir = rootsEnum.nextElement().toString();

        if (rootDir.equalsIgnoreCase("sdcard/")) {
            return "file:///" + rootDir;
        }
    }

    return null;
}

Using this, I got the root directory in its system defined case.

Mudassir
  • 13,962
  • 8
  • 60
  • 85