在我的应用程序中,我想检查SD卡是否存在(asin已安装)。当我尝试运行应用程序时,即使它不存在,我也会“安装SD卡”。
代码
public boolean isSDCardPresent() {
return android.os.Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED);
}
即使没有SD卡,上述代码也会返回true。
答案 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();
}
没有找到这样的东西,所以我想与你分享。