安卓:外置SD卡的绝对路径

6

我有一个非常简单的问题,但到目前为止我无法找到这个问题的答案。 “有没有办法在Android中找到 INTERNAL STORAGE DIRECTORY EXTERNAL STORAGE DIRECTORY(SDCARD)的绝对路径?”

请不要建议使用 Environment.getExternalStorageDirectory ,因为它通常会返回Android操作系统默认选择的内部存储或任何存储介质的路径。

有什么建议吗?


1
Environment.getExternalStorageDirectory被定义为返回“外部存储”目录,但这不一定是可移动卡。它从不返回“内部存储”目录(经典的/data分区)。在一个系统上确定可移动SD卡的路径可能没有Android范围内的标准,该系统还具有焊接的“外部存储”分区,因为这似乎更像是供应商扩展而不是上游Android功能。 - Chris Stratton
1
是的,我同意你的观点。我也认为无法确定可移动SD卡的路径。这应该被实现,因为有时应用程序可能会给用户选择内部存储或外部存储的选项。在这种情况下,要么你硬编码每个设备的目录路径(考虑到今天不同的设备,这不是一个好主意),要么Android应该提供公共API。 - Farhan
@Farhan 你找到任何解决方案了吗?我也在寻找同样的东西。你尝试使用/proc/mount并取得了一些合理的成功吗? - Ahmed
6个回答

5

这个问题之前在SO上已经被问过了,可以使用搜索功能查找。简单来说,“外部存储”更像是“共享存储”,它可能或者可能没有由实际的SD卡实现。有些设备有额外的SD卡,但不用作外部存储。如果您想要的是这个,目前没有公共API可用于访问其挂载位置,并且它因设备而异。您可以检查/proc/mount以查看当前挂载了什么,然后进行操作。


我注意到通常是/mnt/sdcard,但这是普遍的吗? - Nathan Moos
/mnt/sdcard 通常是外部存储的路径,但我认为它并不普遍。其他SD卡(例如Xoom或Iconia上的)则被挂载在其他位置。我看到过关于“次要外部存储”的参考资料,但在SDK中没有相应的API。 - Nikolay Elenkov
是的,在像Xoom、Galaxy Tab、Asus平板电脑、三星Galaxy S2等设备中,/mnt/sdcard通常指向内部存储而不是外部SD卡存储。 - Farhan
感谢 Nikolay 的回答。我也发现目前在 getExternalStorageDirectory() 返回内部共享存储路径的设备中,没有公共 API 可以访问可移动 SD 卡的挂载位置。看来我得尝试制作自己的库 :) - Farhan
尝试使用/proc/mount方法,并查找看起来像外部存储卷的条目 - 相当大且位于形式为/mnt或(对于旧版)/sd路径下的位置。 - Chris Stratton

2
这个链接来自Android配置指南。我认为这是推荐的,而不是必需的。

https://source.android.com/devices/tech/storage/config-example.html

因此,要获取SD卡,您只需执行以下操作。
String storagePath = System.getenv("SECONDARY_STORAGE");

if (storagePath == null) {
    return null;
} else {
     String[] storagePathArray = storagePath.split(":");
     return storagePathArray[0];
}

“EXTERNAL_STORAGE” 似乎存在于我拥有的所有设备上。
“SECONDARY_STORAGE” 已在我的 LG GTab 8.3 和三星 Tab 2&3 上定义,但未在我的 Galaxy S(2.3)或 Dell Venue(4.3)上定义。在三星设备上,它似乎包含多个路径,其中 SD 卡位于首位,因此会出现分裂情况。

1

你应该使用

Environment.getExternalStorageDirectory().getAbsolutePath()

1
请再次检查我的问题。我写道Environment.getExternalStorageDirectory()不一定返回真正外部(SD卡)目录的绝对路径。 - Farhan

1
在三星 Galaxy Note 10.1 2014版SM-P600(我认为大多数同样年代的三星Galaxy Note也是如此),“REAL”外部SD卡的完整路径如下:

/storage/extSdCard/

我通过终端找到了我的SD卡,并执行以下操作:

cd /storage/extSdCard/

一旦进入卡的根目录,我使用“ls”命令列出文件,以便验证其上存储的内容。 这就是我发现我的方法。希望它能帮助其他人。


0

我认为 /storage/sdcard0/ 用于内部SD卡,而 /storage/sdcard1/ 用于外部SD卡,如果有两个存储选项。 如果您要检查文件是否存在于任何一个SD卡中,您应该检查所有可能的路径。

 String path;    
 if(new File("/storage/sdcard/yourpath").exist())
     {
        path="/storage/sdcard/yourpath";
     }
 else if(new File("/storage/sdcard0/yourpath").exists())
     {
        path="/storage/sdcard0/yourpath";
     }
 else if(new File("/storage/sdcard1/yourpath").exists())
     {
        path="/storage/sdcard1/yourpath";
     }

-1

String path=ExternalStorageDirectoryPath + "/foldername/";

字符串路径=ExternalStorageDirectoryPath + "/文件夹名称/";


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接