Android 确定SD卡是否存在的可靠方法

Android 确定SD卡是否存在的可靠方法,android,android-sdcard,android-external-storage,Android,Android Sdcard,Android External Storage,我的问题早些时候也被问到了&因为没有令人满意的答案,我被卡住了。我的要求很简单。我正在开发一个应用程序,需要让用户选择一个存储来保存应用程序内下载。我需要一种方法来确认是否存在外部SD卡。已经尝试了以下方法: 这总是返回真值,可能是由于以下原因: 以下操作也不起作用,因为不同手机的硬编码路径可能不同 File file = new File("/mnt/extSdCard"); try { File list[] = file.listFiles(); T


我的问题早些时候也被问到了&因为没有令人满意的答案,我被卡住了。我的要求很简单。
我正在开发一个应用程序,需要让用户选择一个存储来保存应用程序内下载。我需要一种方法来确认是否存在外部SD卡。
已经尝试了以下方法:

这总是返回真值,可能是由于以下原因:



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

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

任何建议都将不胜感激

Android不公开任何允许您获取SD卡根路径的API。您可以使用反射并从StorageManager.java->GetVolumePath()获取SD卡根路径


您不能任意保存到SD卡上的任何位置。您可以使用从getExternalFilesDirs返回的路径之一,也可以使用SAF(存储访问框架)显式请求用户对SD卡的写入权限

Android不公开任何允许您获取SD卡根路径的API。您可以使用反射并从StorageManager.java->GetVolumePath()获取SD卡根路径

您不能任意保存到SD卡上的任何位置。您可以使用从getExternalFilesDirs返回的路径之一,也可以使用SAF(存储访问框架)显式请求用户对SD卡的写入权限

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

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

我已经在我的手机和模拟器上测试了这个方法。请注意,在测试期间,我已将
null
作为
getExternalFilesDirs
的参数传递。但您也可以传递参数,如
Environment.DIRECTORY\u PICTURES
Environment.DIRECTORY\u MOVIES

测试结果:-

当我的手机插入存储卡时,
getExternalFilesDirs
返回:

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

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

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

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

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

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

注意:在emulator上,SD卡是模拟的(不是真实的)

如果Micro SD卡被弹出(在手机或模拟器上)
getExternalFilesDirs
返回
null

第一条路径(内存):
内存路径-根据设备的不同而有所不同

第二路径(Micro SD):
null

但是

在某些设备上,可能无法获取Micro-SD卡路径。这意味着
getExternalFilesDirs
将只返回一条路径(内存)。第二条路径将为空,即它不会返回任何第二条路径

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

比如说

OEM必须已在中设置辅助存储环境变量 此处提到的特定于设备的
init.rc
文件:

还有somesh对上述的评论说

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

在这种情况下,假设存储卡不存在,并将您想要保存的内容保存到内存中

总结一下,如果
getExternalFilesDirs
没有返回第二条路径或者返回的第二条路径为
null
,则不要存储在SD卡中(存储在内部存储器中);else存储在由
getExternalFilesDirs

建议:

要了解Android中的不同存储位置,请浏览您应该使用的方法。此方法返回内存和Micro SD卡(如果存在)的路径。第二个返回路径是Micro SD卡的路径。但该路径可能不是Micro SD卡的根目录

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

我已经在我的手机和模拟器上测试了这个方法。请注意,在测试期间,我已将
null
作为
getExternalFilesDirs
的参数传递。但您也可以传递参数,如
Environment.DIRECTORY\u PICTURES
Environment.DIRECTORY\u MOVIES

测试结果:-

当我的手机插入存储卡时,
getExternalFilesDirs
返回:

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

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

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

在我的emula上
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();
    }