检查SD卡是否存在,布尔值始终为真

时间:2012-08-23 08:19:49

标签: android splash-screen android-sdcard

在我的启动画面中,我想检查手机是否有SD卡。布尔语句位于:

之下
    Boolean isSDPresent = android.os.Environment.getExternalStorageState()
            .equals(android.os.Environment.MEDIA_MOUNTED );

所以,如果我的手机插槽中有SDCard,这个布尔值将返回true,到目前为止一直很好。当我从设置菜单转到“Unmount SDCard”并移除SDCard,然后杀死应用程序并再次启动它时,布尔值也将为真..

如果我在卸载并移除SD卡后启动Astro File Manager,我仍然可以访问/mnt/sdcard路径,为什么?

我怎样才能成功实现这一目标?

提前致谢!

修改

使用以下代码进行测试:

File path = Environment.getExternalStorageDirectory(); 
String pathS = path.getPath();

当SDCard位于广告位中时,pathS包含mnt/sdcard,但当我删除SD卡时,pathS仍为/mnt/sdcard ...

7 个答案:

答案 0 :(得分:12)

我发现手机,如三星的Galaxy手机,/mnt/sdcard指向内部存储器,而不是预期的外部SD卡。

您可以知道Environment.getExternalStorageDirectory()返回的路径是否实际上是外部SD卡,并且呼叫Environment.isExternalStorageRemovable()

只是想从getExternalStorageDirectory()的文档中添加这个重要的注释:

  

注意:不要在这里混淆“外部”这个词。这个目录   可以更好地被视为媒体/共享存储。它是一个文件系统   可以容纳相对大量的数据,并且可以共享   所有应用程序(不强制执行权限)。传统上这是   SD卡,但它也可以作为内置存储器实现   与受保护的内部存储区别的设备,可以是   作为文件系统安装在计算机上。

答案 1 :(得分:2)

不应该是:

boolean isPresent = Environment.getExternalStorageState().equals(
   Environment.MEDIA_MOUNTED
);

正如Environment.getExternalStorageState()的文档说明:

  

获取主要“外部”存储设备的当前状态

对于Environment.MEDIA_MOUNTED-constant

  如果媒体是,则

getExternalStorageState()会返回MEDIA_MOUNTED   存在并安装在其挂载点,具有读/写访问权限

这将从API Level 1 +

开始

答案 2 :(得分:2)

我修改了如果存在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";
    }

答案 3 :(得分:1)

如果你想显示是否插入了sdcard,那么只需复制粘贴此代码即可为所有设备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();
         }

答案 4 :(得分:1)

我们有两个记忆状态。一个是内部存储卡,另一个是外部SD卡。这取决于设备制造商如何制造存储卡路径。因此,如果您正在检查SD卡可用性,那么由于内部存储器的原因,它可能在两种情况下都返回true。所以选择这种方法:

File[] listOfInternalAndExternalStorage=context.getExternalFilesDirs(null); 
   if(listOfInternalAndExternalStorage.length>=2){
     // it contains sd card
   }

上面的代码将检查listOfInternalAndExternalStorage是否多于一个,然后它有外部存储,否则它不包含SD卡。

答案 5 :(得分:0)

//如果你想保存外部的话,试试这个......

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;
}

答案 6 :(得分:-2)

此代码段可能会用于检测和处理Samsung设备的例外情况:

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;
    }
}