确定是否存在SDCard的确定方法

时间:2016-09-12 06:41:27

标签: android android-sdcard android-external-storage

Android check for SD Card mounted always returns true
我早些时候也提出过我的问题&由于没有令人满意的答案,我被困住了。我的要求非常简单。
我正在开发一个应用程序,我需要让用户选择一个存储空间来保存在应用程序下载中。我需要一种确认外部SD卡存在的方法。
已经尝试过以下方法:

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

  INSERT INTO USERS (user_id, name, Rlist) VALUES ('11101', 'john', [AUE, SAN, UK, LON]);


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

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

任何建议都表示赞赏!

2 个答案:

答案 0 :(得分:3)

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

API级别19中引入的

$request = json_decode($this->_doRequest('/client/some_id')); 是唯一可用于获取SD卡路径的官方方法。所有其他方法将返回内部存储器的公共或私有存储位置(路径)。

我在手机和手机上测试了这种方法模拟器。请注意,我在测试期间已将getExternalFilesDirs作为null的参数。但您也可以传递getExternalFilesDirsEnvironment.DIRECTORY_PICTURES等参数。

测试结果: -

我的手机已插入存储卡时, Environment.DIRECTORY_MOVIES已退回:

第一条路径(内部记忆):getExternalFilesDirs

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

注意:我的SD卡的根目录是:/storage/sdcard1/Android/data/my_package.appname/files

在我的模拟器上, /storage/sdcard1返回:

第一条路径(内部记忆):getExternalFilesDirs

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

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

如果弹出Micro SD卡(在手机或模拟器上) /storage/11E9-4214/Android/data/my_package.appname/files返回getExternalFilesDirs

第一条路径(内部记忆):null

第二条路径(Micro SD):path to internal memory - It varies depending on device

在某些设备上,可能无法获得Micro SD卡路径。这意味着null只会返回一条路径(内部存储器)。第二条路径是空的,即它不会返回任何第二条路径。

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

This answer的{p> this question说,

  

OEM必须在其中设置SECONDARY_STORAGE环境变量   此处提到的设备特定SECONDARY_STORAGE文件:   https://source.android.com/devices/storage/config-example.html

somesh 对上述answer所做的评论也说明了,

  

如果未设置该环境变量,则无法写入SD卡   通过利用init.rc,因为它不会返回   SD卡路径。

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

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

返回的第二个路径中

<强>建议:

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

答案 1 :(得分:1)

Android不公开任何允许您获取SD卡根路径的API。您可以使用反射并从StorageManager.java获取SD卡根路径 - &gt; getVolumePaths() - http://androidxref.com/5.1.1_r6/xref/frameworks/base/core/java/android/os/storage/StorageManager.java#590

您无法随意保存到SD卡上的任何位置。您可以使用从getExternalFilesDirs返回的路径之一,也可以使用SAF(存储访问框架)明确请求用户写入SD卡的权限。 How to use the new SD card access API presented for Android 5.0 (Lollipop)?