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

Android Studio 创建的外部存储目录未在SD卡显示如何解决

问题原因

你使用的Environment.getExternalStorageDirectory()接口返回的是设备内置共享存储路径,对应你看到的/storage/emulated/0/,并不是外置可插拔SD卡的路径,因此创建的目录不会出现在SD卡中。
SD卡参考图片

解决步骤
  • 第一步:声明权限
    在AndroidManifest.xml中添加对应权限,安卓6.0及以上系统还需要在代码中动态申请存储权限:
<!-- 基础存储权限,安卓13以下生效 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="32" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" android:maxSdkVersion="32" />
<!-- 安卓13及以上媒体资源权限 -->
<uses-permission android:name="android.permission.READ_MEDIA_IMAGES" />
<uses-permission android:name="android.permission.READ_MEDIA_VIDEO" />
<uses-permission android:name="android.permission.READ_MEDIA_AUDIO" />
  • 第二步:根据存储场景选择实现方案
    分为两种适配场景:
  1. 仅应用自身需要访问目录,卸载应用时可以同步删除:优先使用外置SD卡的应用专属目录,不需要额外申请权限,适配最简单,实现代码如下:
// 返回的数组第一个元素为内置存储路径,第二个及之后为外置SD卡/USB存储路径
File[] allExternalDirs = getExternalFilesDirs(null);
if (allExternalDirs.length >= 2) {
    File sdCardAppRoot = allExternalDirs[1];
    File targetDir = new File(sdCardAppRoot, "foldername");
    if (!targetDir.exists()) {
        boolean isCreated = targetDir.mkdirs();
        if (isCreated) {
            System.out.println("SD卡目录创建成功,路径为:" + targetDir.getAbsolutePath());
        }
    }
} else {
    System.out.println("未检测到可用的外置SD卡");
}
  1. 需要在SD卡公共区域(根目录、Download等非应用专属路径)创建目录,其他应用也可以访问:安卓10及以上系统禁用了File API对公共存储的直接操作,需要使用存储访问框架(SAF),让用户手动授权SD卡访问权限后再操作,实现代码如下:
    首先调起系统授权页,让用户选择SD卡根目录:
private static final int REQ_SD_CARD_AUTH = 1001;
// 调起授权
Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT_TREE);
startActivityForResult(intent, REQ_SD_CARD_AUTH);

接收授权结果,创建目录:

@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == REQ_SD_CARD_AUTH && resultCode == RESULT_OK && data != null) {
        Uri sdCardRootUri = data.getData();
        // 持久化存储授权,后续不需要重复申请
        getContentResolver().takePersistableUriPermission(sdCardRootUri,
                Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
        // 创建目标目录
        DocumentFile sdCardRoot = DocumentFile.fromTreeUri(this, sdCardRootUri);
        DocumentFile targetDir = sdCardRoot.findFile("foldername");
        if (targetDir == null || !targetDir.exists()) {
            targetDir = sdCardRoot.createDirectory("foldername");
            if (targetDir != null) {
                System.out.println("SD卡公共目录创建成功");
            }
        }
    }
}
注意事项
  • 部分厂商定制系统对SD卡写入有额外限制,如遇到无法创建的情况,请先确认系统是否允许当前应用写入SD卡
  • 非必要场景优先选择应用专属目录存储数据,适配成本更低,不需要申请敏感权限

内容的提问来源于stack exchange,提问作者Chris

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 09:33:00