如何获取Android外部存储(External storage)和内部存储(Internal storage)目录路径
Android内外存储路径获取及容量计算方案
内部存储路径获取
内部存储属于系统核心存储区域,分为应用私有内部存储和系统总内部存储两类,对应获取方式如下:
- 应用私有内部存储路径:调用
context.getFilesDir().getAbsolutePath()即可获取,该路径下的文件仅当前应用可读写,不需要额外申请权限,应用卸载时路径下的内容会同步删除 - 系统总内部存储路径:调用
Environment.getDataDirectory().getAbsolutePath()即可获取,用于计算整个系统内部存储的总容量、可用容量
外部存储路径获取
android.os.Environment.getExternalStorageDirectory()(安卓操作系统环境类获取外部存储目录方法)在Android 10(API 29)及以上版本已被官方废弃,直接调用会返回错误路径或抛出权限异常,需按系统版本适配获取逻辑:
适配Android 9及更低版本(API ≤ 28)
- 提前在清单文件中申请存储权限:
android.permission.READ_EXTERNAL_STORAGE、android.permission.WRITE_EXTERNAL_STORAGE,运行时动态申请权限通过后,再调用Environment.getExternalStorageDirectory().getAbsolutePath()即可获取公共外部存储的根路径
适配Android 10及更高版本(API ≥ 29)
分区存储规则下,普通应用无法直接访问公共外部存储的根路径,分两种场景获取对应路径:
- 仅需计算应用专属外部存储容量:调用
context.getExternalFilesDir(null).getAbsolutePath()即可获取专属路径,无需申请权限,应用卸载时内容同步清除 - 需计算整个公共外部存储容量:直接调用系统
StorageManager服务获取存储卷信息即可,无需申请权限,示例代码如下:
StorageManager storageManager = (StorageManager) getSystemService(Context.STORAGE_SERVICE); // 获取主外部存储卷 StorageVolume primaryVolume = storageManager.getPrimaryStorageVolume(); long totalExternalSize = primaryVolume.getTotalSpace(); long availableExternalSize = primaryVolume.getFreeSpace();
通用容量计算方法
拿到合法的存储路径后,可通过StatFs类统一计算容量信息:
// 传入合法的存储路径字符串 StatFs statFs = new StatFs(targetPath); long blockSize = statFs.getBlockSizeLong(); // 总容量 = 块数量 × 单块大小 long totalSpace = statFs.getBlockCountLong() * blockSize; // 可用容量 = 可用块数量 × 单块大小 long availableSpace = statFs.getAvailableBlocksLong() * blockSize;
注意容量单位转换时,要和系统显示规则对齐,商用场景建议按1GB=1000MB转换,技术场景可按1GB=1024MB转换,避免出现显示容量和实际计算容量不符的问题。
内容的提问来源于stack exchange,提问作者Raj Bhagat
相关产品推荐
相关产品推荐

