Android check for SD Card mounted always returns true
我的问题也已经被提早了,因为没有令人满意的答案,所以我陷入了困境。我的要求很简单。我正在开发一个应用程序,在该应用程序中,我需要让用户选择要保存在应用程序下载中的存储。我需要一种方法来确认存在外部SD卡。已经尝试了以下方法:

由于以下原因,这总是返回true:https://stackoverflow.com/a/7790228/3475715

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


以下操作也不起作用,因为不同的手机的硬编码路径可能不同

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


任何建议表示赞赏!

最佳答案

您应该使用getExternalFilesDirs方法。此方法将路径返回到内存和Micro SD卡(如果有)。返回的第二个路径将是Micro SD卡的路径。但是该路径可能不是Micro SD卡的根目录。

API级别19中引入的getExternalFilesDirs是可用于获取SD卡路径的唯一官方方法。所有其他方法将返回内部存储器的公共或私有存储位置(路径)。

我已经在手机和模拟器上测试了此方法。请注意,在测试过程中,我已将null作为getExternalFilesDirs的参数传递。但是,您也可以传递Environment.DIRECTORY_PICTURESEnvironment.DIRECTORY_MOVIES等参数。

检测结果:-

手机插入存储卡后,getExternalFilesDirs返回:

第一条路径(内部存储器):/storage/emulated/0/Android/data/my_package.appname/files

第二路径(Micro SD):/storage/sdcard1/Android/data/my_package.appname/files

注意:我的SD卡的根目录为:/storage/sdcard1

在我的模拟器上,getExternalFilesDirs返回:

第一条路径(内部存储器):/storage/emulated/0/Android/data/my_package.appname/files

第二路径(Micro SD):/storage/11E9-4214/Android/data/my_package.appname/files

注意:在仿真器上,SD卡是仿真的(不是真实的)。

如果已弹出Micro SD卡(在电话或仿真器上),则getExternalFilesDirs返回null

第一条路径(内部存储器):path to internal memory - It varies depending on device

第二路径(Micro SD):null

但是;

在某些设备上,您可能无法获得Micro SD卡路径。这意味着getExternalFilesDirs将仅返回一个路径(内部存储器)。第二条路径为空,即不会返回任何第二条路径。

原因:该特定设备的OEM可能未在设备中设置路径(即SECONDARY_STORAGE环境变量)。

This answer表示this question说,


  OEM必须在以下位置设置SECONDARY_STORAGE环境变量
  特定于设备的init.rc文件,如下所示:
  https://source.android.com/devices/storage/config-example.html


另外,somesh对上述answer所作的评论说:


  如果未设置该环境变量,则无法写入sdcard
  通过使用getExternalFilesDirs,因为它不会返回
  sdcard路径。


在这种情况下,请假定不存在存储卡,然后将要保存的任何内容保存在内存中。

总结一下,如果getExternalFilesDirs不返回第二条路径或返回的第二条路径是null,请不要存储在SD卡中(存储在内部存储器中);否则存储在getExternalFilesDirs返回的第二条路径中

建议:

要了解Android中不同的存储位置,请通过my answer on stackoverflow

关于android - 确定SD卡是否存在的确定方法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39444607/

10-11 15:27