Android 8+三星手机外置SD卡无法创建文件夹写入文件求助
问题分析与解决方案
你遇到的核心问题是Android系统对外置SD卡的写入权限限制,普通的WRITE_EXTERNAL_STORAGE权限无法让你直接写入外置SD卡的根目录或非APP专属目录,尤其是Android 8.0+(API 26)及三星机型的权限管控更严格。
错误原因
从Android 4.4开始,第三方应用仅被允许写入外置SD卡的APP专属目录(路径格式:/storage/[SD卡ID]/Android/data/[你的应用包名]/files/),其他位置(比如SD卡根目录)需要通过**存储访问框架(SAF)**获取用户手动授权才能写入。你直接操作/storage/1234-5678/new_folder/属于未授权的非专属目录,所以mkdirs()会返回false。
解决方案
方案1:写入APP专属目录(无需额外授权)
这是最简便的方式,系统默认允许应用在自身专属目录读写,无需用户额外授权:
// 获取所有外部存储目录,第二个元素即为外置SD卡的专属目录 File[] externalFilesDirs = getExternalFilesDirs(null); if (externalFilesDirs.length > 1 && externalFilesDirs[1] != null) { // 在专属目录下创建new_folder File directory = new File(externalFilesDirs[1], "new_folder"); if (!directory.exists()) { boolean ok = directory.mkdirs(); // 此时ok应返回true,创建成功 } }
方案2:通过SAF写入非专属目录(如SD卡根目录)
如果必须在SD卡根目录或其他非专属位置创建文件夹,需要使用存储访问框架让用户手动授权:
- 启动SAF目录选择界面:
private static final int REQUEST_CODE_SAF = 1001; // 触发目录选择 Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT_TREE); startActivityForResult(intent, REQUEST_CODE_SAF);
- 处理授权结果(AndroidX建议使用
registerForActivityResult,以下为传统方式):
@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == REQUEST_CODE_SAF && resultCode == RESULT_OK) { Uri treeUri = data.getData(); // 申请持久化权限,避免重启应用后失效 getContentResolver().takePersistableUriPermission(treeUri, Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION); // 创建目标文件夹 DocumentFile rootDir = DocumentFile.fromTreeUri(this, treeUri); DocumentFile newFolder = rootDir.createDirectory("new_folder"); // 判断是否创建成功 if (newFolder != null) { // 创建成功逻辑 } } }
额外注意事项
- 三星部分机型可能对SD卡有额外的权限管控,确保用户在系统设置中开启了应用的存储权限。
- 若SD卡开启了写保护,也会导致写入失败,可以尝试重新插拔SD卡或更换卡测试。
内容的提问来源于stack exchange,提问作者scheininger
相关产品推荐
相关产品推荐

