持有MANAGE_EXTERNAL_STORAGE的文件管理/杀毒应用替代Environment.getExternalStorageDirectory()方案
持有MANAGE_EXTERNAL_STORAGE权限下Environment.getExternalStorageDirectory()的官方替代方案
首先明确前提:对于已合法申请并获得MANAGE_EXTERNAL_STORAGE权限的文件管理、杀毒类应用,现有废弃APIEnvironment.getExternalStorageDirectory()在所有公开Android版本中均可正常返回/storage/emulated/0/格式的主外部存储根路径,官方暂无移除该API的公开时间表,可正常使用。
如果需要完全规避废弃API,可使用以下两种官方推荐的替代方案:
- 单主存储场景快速获取路径
通过应用专属外部存储路径向上回溯即可得到主外部存储根路径,示例代码如下:
// 返回路径格式为 /storage/emulated/0/Android/data/[应用包名]/files File appExternalDir = getApplicationContext().getExternalFilesDir(null); if (appExternalDir != null) { // 连续向上回溯3级即可拿到主存储根目录 File externalRoot = appExternalDir.getParentFile().getParentFile().getParentFile(); }
- 多存储设备(含SD卡、外接U盘等)场景适配
API 30及以上可使用StorageManager提供的无废弃标注API获取所有存储卷的根路径,是官方优先推荐的适配方案,示例代码如下:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { StorageManager storageManager = getSystemService(StorageManager.class); List<StorageVolume> allVolumes = storageManager.getStorageVolumes(); for (StorageVolume volume : allVolumes) { File volumeRoot = volume.getDirectory(); if (volumeRoot == null) continue; // 主内置存储对应的volumeRoot路径即为 /storage/emulated/0/ // 可移动存储设备的根路径也可通过该方法统一获取 } }
注意:以上两种方案的正常使用前提是应用已成功获取
MANAGE_EXTERNAL_STORAGE权限,未获取该权限时即使拿到根路径也无法访问目录下的非应用专属文件。
内容的提问来源于stack exchange,提问作者Ruthwik R
相关产品推荐
相关产品推荐

