好的,我已经搜索了论坛的高低,我无法找到一个可接受的答案来测试SD卡是否正确安装并且可以在Android 7设备上写入。 (有很多答案,但没有一个真正奏效)。
我知道必须使用 Environment.getExternalStorageState(),根据我的代码:
pathName=context.getFilesDir().getAbsolutePath()+"/"+SavePath;
if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED))
pathName= Objects.requireNonNull(context.getExternalFilesDir(SavePath)).getAbsolutePath();
但是...
无论是否安装了SD卡,这都会返回TRUE,因为SD卡是作为模拟资源安装的,而不是可移动资源。
我可以使用Environment.isExternalStorageEmulated()来检查这种状态,但它仍然没有告诉我SD卡是否可用。 (即:isExternalStorageEmulated()将始终返回true,无论是否存在SD卡,因为它是由文件系统在启动时设置的,并不似乎关心插槽中是否有物理SD卡或不是)。
除了尝试写入SD卡并捕获异常错误(如果它不存在)之外,有没有办法在我尝试写入之前判断SD卡是否存在?< / p>
编辑:
在审核了建议的解决方案后,这是我能想到的最好的解决方案。这看起来很笨重。关于如何改进这个的任何想法?
if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
if (Environment.isExternalStorageEmulated()){
File[] storage=getExternalFilesDirs(null);
// Find the first non-emulated storage space
for (File file: storage){
if (!file.toString().contains("emulated/"))
System.out.println(file.toString());
}
}
}
答案 0 :(得分:1)
由于您放弃了模拟存储,因此您的编辑答案看起来不错。或者,您也可以计算目录。如果大于1(还会丢弃模拟存储),则该存储具有SD卡:
public boolean hasExternalSD() {
if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
//External Storage Emulated
if (Environment.isExternalStorageEmulated()){
if (ContextCompat.getExternalFilesDirs(context, null).length > 1) {
return true;
}
}
}
return false;
}
答案 1 :(得分:0)
每个Android设备上始终都可以使用getFilesDir()
和getExternalStorageDirectory()
。
它们与可拆卸的micro SD卡无关。