【问题标题】:Check if the SDCard is present, boolean is always true检查 SDCard 是否存在,布尔值始终为真
【发布时间】:2012-08-18 17:25:09
【问题描述】:

在我的初始屏幕中,我想检查手机是否有 SDCard。布尔语句如下:

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

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

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

我怎样才能做到这一点?

提前致谢!

编辑

使用以下代码进行测试:

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

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

【问题讨论】:

  • brianestey 的回答可能是正确的。您能否记录 Environment.getExternalStorageDirectory() 的输出并告诉我们?
  • 我面临同样的问题。请参阅我对答案的最后编辑,以解释为什么“externalStorage”并不总是我们认为的 SD 卡。我希望有一个更好的 API 来访问 SD 卡,但是除了在我的代码中对已知路径进行特殊检查之外,我还没有找到任何东西。
  • 使用文件管理器转到 /mnt。列出了哪些文件夹?

标签: android splash-screen android-sdcard


【解决方案1】:

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

Environment.getExternalStorageDirectory()返回的路径是否真的是外置SD卡,调用Environment.isExternalStorageRemovable()就可以知道了

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

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

【讨论】:

  • 我正在三星 Galaxy S3 上进行测试,这很奇怪。很奇怪!
  • 对于 S3,我发现 /mnt/sdcard 上有一个名为 external_sd 的目录,它指向 SD 卡本身。实际上,我刚刚检查了我的代码,S3 可能在路径 /mnt/extSdCard 中也有外部 sd。
  • 在三星设备上@9​​87654326@ 指向内置的“外部”(不可移动)存储。实际的可移动外部存储(SD 卡)位于/mnt/sdcard/external_sd。请参阅我的答案以了解如何处理。
【解决方案2】:

不应该是:

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

正如Environment.getExternalStorageState() 的文档所述:

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

对于Environment.MEDIA_MOUNTED-constant

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

这将适用于 API 级别 1+

【讨论】:

  • 请参阅我的回答中的注释。 Galaxy 手机具有内部存储器,可用作“外部”存储。
  • @brianestey 方法应该仍然适用。 “外部”一词对于每个记录的方法都是相对的。我还没有测试过,但它应该可以正常工作。
  • 对于 Galaxy 手机,externalStorageState 总是挂载的,因为所谓的“外部”实际上是内置在手机中的。
  • @brianestey 没关系。文档指出,这将识别“主要”存储设备。天气是否已满在另一张纸上。
  • 好的,我同意文档。但问题与 SD 卡有关,它并不总是主要的外部存储设备。
【解决方案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";
    }

【讨论】:

    【解决方案4】:

    如果您想显示是否插入了 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();
             }
    

    【讨论】:

    • 谢谢!这似乎比 Environment.isExternalStorageRemovable() 或检查 Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED) 更准确。在插入/弹出和 SDCard 时,我在某些设备上测试了所有这三种方法。
    【解决方案5】:

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

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

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

    【讨论】:

      【解决方案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;
      }
      

      【讨论】:

        【解决方案7】:

        此代码 sn-p 可能对您检测和处理三星设备的异常有用:

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

        【讨论】:

        • 不幸的是,这不适用于最新的手机,因为它们没有 external_sd 而是 ExtSdCard
        猜你喜欢
        • 2019-08-07
        • 1970-01-01
        • 2018-06-19
        • 2013-11-16
        • 2022-07-31
        • 1970-01-01
        • 2021-03-12
        • 2019-05-22
        • 2021-11-07
        相关资源
        最近更新 更多