好的,我已经搜索了论坛上下,无法找到一个可接受的答案来测试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卡之前,有没有其他方法来判断SD卡是否存在?
编辑:
在检讨了建议的解决方案后,这是我所能想出的最好办法。这看起来很笨重。关于如何改进这个问题,有什么建议吗?
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());
}
}
}发布于 2018-08-17 23:03:49
您的编辑答案看起来不错,因为您放弃了模拟存储。作为另一种选择,您也可以计算目录。如果它大于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;
}发布于 2018-06-11 12:26:02
getFilesDir()和getExternalStorageDirectory()在每个安卓设备上都是可用的。
他们与可移动的微SD卡无关。
https://stackoverflow.com/questions/50797046
复制相似问题