21

在我的启动画面中,我想检查手机是否有 SDCard。布尔语句如下:

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

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

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

我怎样才能做到这一点?

提前致谢!

编辑

使用以下代码进行测试:

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

当 SDCard 在插槽中时,pathScontains mnt/sdcard,但是当我移除 SDCard 时,pathS它仍然/mnt/sdcard...

4

7 回答 7

13

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

通过调用Environment.isExternalStorageRemovable()可以知道Environment.getExternalStorageDirectory()返回的路径是否真的是外部 SD 卡

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

注意:不要被这里的“外部”这个词弄糊涂了。最好将此目录视为媒体/共享存储。它是一个文件系统,可以保存相对大量的数据,并且在所有应用程序之间共享(不强制执行权限)。传统上这是一张 SD 卡,但它也可以作为设备中的内置存储实现,与受保护的内部存储不同,并且可以作为文件系统安装在计算机上。

于 2012-08-23T08:22:51.433 回答
2

不应该是:

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

正如文档所述Environment.getExternalStorageState()

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

对于Environment.MEDIA_MOUNTED-constant

getExternalStorageState()MEDIA_MOUNTED 如果媒体存在并以读/写访问权限安装在其安装点,则返回。

这将适用于 API 级别 1+

于 2012-08-23T08:30:02.380 回答
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";
    }
于 2013-09-02T12:31:16.623 回答
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();
         }
于 2015-08-03T15:34:37.043 回答
1

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

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

上面的代码会检查 listOfInternalAndExternalStorage 是否大于 1 是否有外部存储,否则不包含 sd 卡。

于 2017-11-22T07:09:27.433 回答
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;
}
于 2018-04-19T04:18:51.050 回答
-2

此代码片段可能有助于您检测和处理三星设备的异常:

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;
    }
}
于 2012-08-23T08:56:32.803 回答