检查SD卡可用性android

时间:2015-06-22 09:50:38

标签: android android-external-storage

在我的应用程序中,我想检查SD卡是否存在(asin已安装)。当我尝试运行应用程序时,即使它不存在,我也会“安装SD卡”。

代码

public boolean isSDCardPresent() {

        return android.os.Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED);

    }

即使没有SD卡,上述代码也会返回true。

4 个答案:

答案 0 :(得分:0)

尝试将您的方法更改为此

public boolean isSDCardPresent() {

    return android.os.Environment.getExternalStorageState().equals(android.os.Environment.MEDIA_MOUNTED);

}

答案 1 :(得分:0)

尝试以下代码:

public boolean isSDCardPresent() { 
    return android.os.Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED_READ_ONLY);
}

答案 2 :(得分:0)

外部(可移动)Sd路径因设备而异,我也无法找出检查其可用性的单一方法,因此我编写了一个方法,该方法遍历所有不同的ext路径制造商使用,然后找到完全匹配。如果找到该文件夹​​,则返回true;卡插入手机。

注意:我在方法中使用了StreamSupport库,因此您需要下载jar文件并将其添加到项目的libs文件夹中,并将其添加到项目的libs文件夹中。工作!

   public static boolean isExternalCardAvailable(Context context) {
    List<String> listOfFoldersToSearch = Arrays.asList("/storage/", "/mnt/", "/removable/", "/data/");
    final List<String> listOf2DepthFolders = Arrays.asList("sdcard0", "media_rw", "removable");
    final List<String> listOfExtFolders = Arrays.asList("sdcard1", "extsdcard", "external_sd", "microsd", "emmc", "ext_sd", "sdext",
            "sdext1", "sdext2", "sdext3", "sdext4");
    final String[] thePath = {""};
    Optional<File> optional = StreamSupport.stream(listOfFoldersToSearch)
            .filter(new Predicate<String>() {
                @Override
                public boolean test(final String s) {
                    File folder = new File(s);
                    return folder.exists() && folder.isDirectory();
                }
            }) //I got the ones that exist and are directories
            .flatMap(new Function<String, Stream<File>>() {
                @Override
                public Stream<File> apply(final String s) {
                    try {
                        List<File> files = Arrays.asList(new File(s).listFiles());
                        return StreamSupport.stream(files);
                    } catch (NullPointerException e) {
                        return StreamSupport.stream(new ArrayList<File>());
                    }
                }
            }) //I got all sub-dirs of the main folders
            .flatMap(new Function<File, Stream<File>>() {
                @Override
                public Stream<File> apply(final File file1) {
                    if (listOf2DepthFolders.contains(file1.getName()
                            .toLowerCase())) {
                        try {
                            List<File> files = Arrays.asList(file1.listFiles());
                            return StreamSupport.stream(files);
                        } catch (NullPointerException e) {
                            return StreamSupport.stream(Collections.singletonList(file1));
                        }
                    } else
                        return StreamSupport.stream(Collections.singletonList(file1));
                }
            }) //Here I got all the 2 depth and 3 depth folders
            .filter(new Predicate<File>() {
                @Override
                public boolean test(final File o) {
                    return listOfExtFolders.contains(o.getName()
                            .toLowerCase());
                }
            })
            .findFirst();

    optional.ifPresent(new Consumer<File>() {
        @Override
        public void accept(final File file) {
            thePath[0] = file.getAbsolutePath();
        }
    });

    Log.e("Path", thePath[0]);

    try {
        ContextCompat.getExternalFilesDirs(context, null);
    } catch (Exception e) {
        Log.e("PathException", thePath[0]);
    }
    return !thePath[0].equals("") && new File(thePath[0]).listFiles()!=null;
}

P.S。我在一些HTC和三星设备上测试并验证了它。

答案 3 :(得分:0)

昨天我遇到了一个非常类似的问题:

我想检查一下,如果我的设备中有物理Sd卡。

问题在于

public boolean isSDCardPresent() {

return android.os.Environment.getExternalStorageState().equals(android.os.Environment.MEDIA_MOUNTED);}

总是返回true(即使sd-card被物理移除),因为模拟的SD卡。

所以这是我的解决方案:

static boolean externalStoragecheck() {
    return !Environment.isExternalStorageEmulated();
}

没有找到这样的东西,所以我想与你分享。