我正在尝试在micro SDCard上保存一些文件。要检查SD卡的可用性,我使用以下方法;
private boolean isSdCardReady() {
Enumeration e = FileSystemRegistry.listRoots();
while (e.hasMoreElements()) {
if (e.nextElement().toString().equalsIgnoreCase("sdcard/")) {
return true;
}
}
return false;
}
即使此方法返回true,当我尝试保存文件时,它也会提供异常net.rim.device.api.io.file.FileIOException: File system is not ready
。
这意味着什么?如果SDCard不可用,那么为什么它列在FileSystemRegistry.listRoots()
中?
如何确保SDCard可用于写作?
我的开发环境:
答案 0 :(得分:4)
通常我在设备重启时尝试访问SD卡时出现此错误。您必须推迟应用程序中的所有操作,直到启动完成:
while (ApplicationManager.getApplicationManager().inStartup()) {
try {
Thread.sleep(500);
} catch (InterruptedException ignored) {
}
}
我还记得另一个可能的原因here。使用后必须关闭所有流。
答案 1 :(得分:3)
解决了这个问题。当rootsEnum.nextElement().toString();
返回“SDCard”时,我正在寻找“sdcard”。是的,它区分大小写。现在,我没有使用硬编码的“SDCard”,而是将上述方法更改为以下方法;
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;
}
使用这个,我在系统定义的情况下获得了根目录。