Android 11用SimpleStorage API复制文件报NO_SPACE_LEFT_ON_TARGET_PATH(空间充足)
问题分析与解决方案
核心原因
出现NO_SPACE_LEFT_ON_TARGET_PATH错误并非真的存储空间不足,大概率是以下问题导致:
- 目标路径权限受限:Android 10及以上采用分区存储机制,硬编码
/sdcard/Left这类绝对路径可能无法获取正确的写入权限,导致API误判空间不足。 - 路径指向错误:硬编码路径可能未指向你预期的有20GB剩余空间的存储分区,比如混淆了内置存储和外接SD卡路径,或该路径实际不存在。
解决办法
1. 替换硬编码路径为SAF获取的目标目录URI
不要直接使用绝对路径,改用ACTION_OPEN_DOCUMENT_TREE让用户选择目标备份目录,获取其URI后再执行复制:
// 先通过SAF获取目标目录的URI(逻辑同选择源文件夹) // 假设已获取目标目录URI为targetTreeUri DocumentFile targetDir = DocumentFile.fromTreeUri(this, targetTreeUri); // 修改savefile函数,用目标目录DocumentFile替代绝对路径 public void savefile(Uri sourceuri) { DocumentFile sourceFile = DocumentFileCompat.fromUri(this, sourceuri); DocumentFileUtils.copyFileTo(sourceFile, targetDir, null, new FileCallback() { @Override public void onConflict(@NotNull DocumentFile destinationFile, @NotNull FileCallback.FileConflictAction action) { // 处理文件冲突,比如选择覆盖 action.override(); } @Override public void onCompleted(@NotNull Object result) { // 复制完成逻辑 } @Override public void onReport(Report report) { Log.d("Progress", String.valueOf(report.getProgress())); } @Override public void onFailed(ErrorCode errorCode) { Log.d("Error", errorCode.toString()); } }); }
2. 验证目标路径的真实可用空间
在复制前先检查目标路径的实际剩余空间,确认是否真的充足:
public long getAvailableSpace(String path) { StatFs statFs = new StatFs(path); long blockSize = statFs.getBlockSizeLong(); long availableBlocks = statFs.getAvailableBlocksLong(); return availableBlocks * blockSize; } // 使用示例 long freeSpace = getAvailableSpace("/sdcard/Left"); Log.d("Free Space", freeSpace / (1024*1024) + "MB");
如果返回的剩余空间远小于预期,说明路径指向错误,需要确认目标路径的正确性。
3. 检查SimpleStorage API适配性
确保使用的SimpleStorage库版本适配当前Android系统版本,避免因API兼容问题导致路径解析错误,建议使用最新稳定版。
内容的提问来源于stack exchange,提问作者Josh Hunter
相关产品推荐
相关产品推荐

