You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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权限(该权限会影响应用上架应用市场,按需使用)
  • 核心获取代码(适配你当前使用的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.03 05:33:28