Android开发如何获取可挂载外置SD卡/storage/externalSd访问路径
Android 可挂载外置SD卡(/storage/externalSd路径)访问实现
首先明确:你之前使用的Android.OS.Environment.ExternalStorageDirectory.Path(注:原代码存在拼写错误,GeyExternalStorage应为ExternalStorageDirectory)只能获取设备内置共享存储路径,也就是固定返回/storage/emulated/0,无法拿到可移除SD卡的挂载路径。
可移除SD卡的路径没有全局统一的固定值,不同厂商的挂载命名规则存在差异,部分定制设备会挂载到/storage/externalSd,其他常见路径还包括/storage/extSdCard、/storage/sdcard1、UUID格式路径/storage/xxxx-xxxx等,优先推荐用系统官方API获取,兼容性最高。
实现步骤
- 先声明对应权限
在AndroidManifest.xml中添加所需权限:- Android 12及以下版本:声明
READ_EXTERNAL_STORAGE、WRITE_EXTERNAL_STORAGE读写权限 - Android 13及以上版本:按需声明对应媒体读取权限,若需要访问SD卡全目录,需额外申请
MANAGE_EXTERNAL_STORAGE权限(该权限会影响应用上架应用市场,按需使用)
- Android 12及以下版本:声明
- 核心获取代码(适配你当前使用的Xamarin.Android C#语法)
通过系统StorageManager服务遍历所有存储卷,筛选可移除的非主存储(即外置SD卡),自动获取对应设备的真实挂载路径,自动适配/storage/externalSd这类定制路径:
// 获取存储管理系统服务 var storageManager = (StorageManager)ApplicationContext.GetSystemService(Android.Content.Context.StorageService); foreach (var volume in storageManager.StorageVolumes) { // 筛选条件:可移除存储 + 不是内置主存储 if (volume.IsRemovable && !volume.IsPrimary) { // 该路径就是当前设备外置SD卡的真实挂载路径 string sdCardPath = volume.Directory.AbsolutePath; // 拿到路径后即可按照正常文件操作逻辑读写 break; } }
- 固定路径适配方案(仅适用于你明确知道目标设备固定挂载到
/storage/externalSd的场景)
如果你的应用只跑在固定路径为/storage/externalSd的定制设备上,可以直接写死路径,但必须加可用性校验,避免异常:
Java.IO.File externalSd = new Java.IO.File("/storage/externalSd"); if (externalSd.Exists() && externalSd.CanRead()) { string sdPath = externalSd.AbsolutePath; // 路径可用,正常读写 } else { // 路径未挂载/不存在,走上面的StorageManager遍历逻辑兜底 }
注意:不要在面向通用用户的应用里硬编码
/storage/externalSd路径,否则在其他品牌机型上大概率会出现找不到路径、读写失败的问题。
内容的提问来源于stack exchange,提问作者Liam Billy
相关产品推荐
相关产品推荐

