测试SD卡是否正确安装且可写

时间:2018-06-11 11:49:11

标签: android android-external-storage

好的,我已经搜索了论坛的高低,我无法找到一个可接受的答案来测试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());
                }

            }
        }

2 个答案:

答案 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卡无关。