Android Studio 创建的外部存储目录未在SD卡显示如何解决
问题原因
你使用的Environment.getExternalStorageDirectory()接口返回的是设备内置共享存储路径,对应你看到的/storage/emulated/0/,并不是外置可插拔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" />
- 第二步:根据存储场景选择实现方案
分为两种适配场景:
- 仅应用自身需要访问目录,卸载应用时可以同步删除:优先使用外置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卡"); }
- 需要在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
相关产品推荐
相关产品推荐

