在我的闪屏,我要检查,如果手机有一个SD卡。 布尔语句是下面:
Boolean isSDPresent = android.os.Environment.getExternalStorageState()
.equals(android.os.Environment.MEDIA_MOUNTED );
所以,如果我在我的手机上的插槽和SD卡,这个布尔将返回true,到目前为止,一切顺利。 当我去“卸载SD卡”,从设置菜单,并删除SD卡,然后杀死应用程序,并再次启动它,布尔也将是真实的..
如果我启动Astro File Manager
卸载和删除的SD卡后,我仍然可以访问/mnt/sdcard
路径,为什么呢?
如何管理做到这一点?
提前致谢!
编辑
用下面的代码进行测试:
File path = Environment.getExternalStorageDirectory();
String pathS = path.getPath();
当SD卡在插槽中,该pathS
包含mnt/sdcard
,但是当我删除SD卡的pathS
仍然是/mnt/sdcard
...
Answer 1:
我发现手机,如三星的Galaxy手机,有/mnt/sdcard
点到内部存储器而不是外部SD卡作为预期。
您可知道,如果返回的路径Environment.getExternalStorageDirectory()实际上是外置SD卡的通话Environment.isExternalStorageRemovable()
只是想从文档的getExternalStorageDirectory()这个重要的注意事项补充:
注意:千万不要被这个词在这里混淆“外部”。 这个目录可以更好地被认为是媒体/共享存储。 它是一个可以容纳比较大量的数据的一个文件系统,是跨所有应用程序(不强制权限)共享。 传统上,这是SD卡,但它也可以被实现为在一个装置,该装置从受保护的内部存储不同并且可以被安装为在计算机上文件系统的内置存储。
Answer 2:
它不应该是:
boolean isPresent = Environment.getExternalStorageState().equals(
Environment.MEDIA_MOUNTED
);
作为文档状态Environment.getExternalStorageState()
获取主“外部”存储设备的当前状态 。
而对于Environment.MEDIA_MOUNTED
的常数 :
getExternalStorageState()
返回MEDIA_MOUNTED
如果介质存在,并且安装在其安装点具有读/写访问 。
而这会从API级别工作1+
Answer 3:
我改性壳聚糖,如果存在SD卡,设置有路径如果不是在内部目录设置它
Boolean isSDPresent = android.os.Environment.getExternalStorageState().equals(android.os.Environment.MEDIA_MOUNTED);
if(isSDPresent)
{
path = theAct.getExternalCacheDir().getAbsolutePath() + "/GrammarFolder";
}
else
{
path = theAct.getFilesDir() + "/GrammarFolder";
}
Answer 4:
如果你想显示SD卡是否插入或不那么就复制粘贴此代码其工作对所有设备的100%,代码是在这里:
File file = new File("/mnt/extSdCard");
try
{
File list[] = file.listFiles();
Toast.makeText(getApplicationContext(), "Yes sdcard is mounted, file count "+list.length, Toast.LENGTH_LONG).show();
}
catch(NullPointerException o)
{
Toast.makeText(getApplicationContext(), "Sorry no sdcard is mounted:", Toast.LENGTH_LONG).show();
}
Answer 5:
我们有两个内存状态。 一个是内部的存储卡等外部SD卡。 这取决于设备制造商,他们是如何制造的存储卡路径。 所以,如果你检查SD卡的可用性则可能由于内部存储器返回两种情况属实。 所以要为这个方法:
File[] listOfInternalAndExternalStorage=context.getExternalFilesDirs(null);
if(listOfInternalAndExternalStorage.length>=2){
// it contains sd card
}
上面的代码会检查是否listOfInternalAndExternalStorage多于一个,然后它有外部存储,否则它不包含SD卡。
Answer 6:
//试试这个,如果你喜欢保存外部...
public String preferextstorage(Context con){
int version = Build.VERSION.SDK_INT;
String result=con.getFilesDir().getPath();
if (version>=19) {
File[] listOfInternalAndExternalStorage = con.getExternalFilesDirs(null);
if (listOfInternalAndExternalStorage.length >= 2) {
// it contains sd card
if (listOfInternalAndExternalStorage[1]==null){
result=listOfInternalAndExternalStorage[0].getPath();
}else
{
result=listOfInternalAndExternalStorage[1].getPath();
}
return result;
}
}
return result;
}
Answer 7:
这段代码可能是使用的为你及时发现并处理与三星设备除外:
public static String getExternalStorage() {
String str = Environment.getExternalStorageDirectory().getAbsolutePath();
if ( isSamsungDevice() ) {
if ( isSamsungExternalSDMounted() ) {
str += "/external_sd";
}
}
return str;
}
private static boolean isSamsungDevice() {
return new File( Environment.getExternalStorageDirectory().getAbsolutePath() + "/external_sd" ).exists();
}
private static boolean isSamsungExternalSDMounted() {
return exec( "mount" ).indexOf( "external_sd" ) >= 0;
}
public static String exec( String paramString ) {
try {
String str = "";
InputStream localInputStream = Runtime.getRuntime().exec( paramString ).getInputStream();
byte[] arrayOfByte = new byte[1024];
StringBuilder localStringBuilder = new StringBuilder();
while ( true ) {
int i = localInputStream.read( arrayOfByte, 0, arrayOfByte.length );
if ( i == -1 ) {
str = localStringBuilder.toString();
break;
}
localStringBuilder.append( new String( arrayOfByte, 0, i ) );
}
return str;
} catch ( IOException e ) {
e.printStackTrace();
return null;
}
}
文章来源: Check if the SDCard is present, boolean is always true