Android无外置SD卡时,如何向内部存储根目录MyFolder写入文件?
解决Android内部存储根目录MyFolder写入文件的问题
嘿,我来帮你搞定这个写入文件的问题!首先得理清几个关键点:你说的「内部存储根目录」其实就是Android里的共享存储根目录(也就是ES文件管理器里看到的/sdcard/目录,因为没挂载外置SD卡,这个就是默认的外部存储根路径),之前代码没生效大概率是权限没处理到位,或者没提前创建文件夹,下面分情况给你说正确的设置方式:
第一步:先搞定权限问题
这是最容易踩坑的地方,不同Android版本的权限要求不一样:
如果你的App目标SDK是28(Android 9)及以下:
先在AndroidManifest.xml里加这两个权限:<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />而且在Android 6.0+的设备上,必须动态申请权限,不能只靠Manifest声明。
如果是目标SDK 29+(Android 10及以上):
因为Scoped Storage的限制,直接写入根目录的自定义文件夹需要申请「所有文件访问权限」,在Manifest里加:<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" tools:ignore="ScopedStorage" /> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />代码里还要引导用户手动开启权限:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { if (!Environment.isExternalStorageManager()) { Intent intent = new Intent(Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION); Uri uri = Uri.fromParts("package", getPackageName(), null); intent.setData(uri); startActivity(intent); } }
第二步:正确设置sd变量
针对你的场景,正确的sd变量设置应该是:
File sd = Environment.getExternalStorageDirectory();
你之前尝试的其他几个选项都不对:
Environment.getExternalStoragePublicDirectory(DIRECTORY_DOWNLOADS):指向Downloads公共目录,不是根目录Environment.getRootDirectory():这是系统根目录/system,没有写入权限Environment.getDataDirectory():这是/data目录,需要Root才能写入
第三步:完善写入逻辑
光设置sd变量还不够,还要确保文件夹存在,不然文件写不进去,完整代码示例:
// 正确的sd变量 File sd = Environment.getExternalStorageDirectory(); String backupDBPath = "MyFolder/_subfolder/mydata.txt"; File backupDB = new File(sd, backupDBPath); // 先创建父文件夹(_subfolder),如果不存在的话 if (!backupDB.getParentFile().exists()) { boolean isCreated = backupDB.getParentFile().mkdirs(); if (!isCreated) { // 这里可以加日志或者提示,文件夹创建失败 return; } } // 开始写入文件 try (FileOutputStream fos = new FileOutputStream(backupDB)) { fos.write("测试数据".getBytes(StandardCharsets.UTF_8)); // 写入成功的逻辑 } catch (IOException e) { e.printStackTrace(); // 处理写入失败的情况 }
额外提醒
如果这个MyFolder是你的App专用的,其实更推荐用App专属的外部存储目录(不需要额外权限,Android 10+也支持),路径是getExternalFilesDir(null),对应的目录是/sdcard/Android/data/你的包名/files/,这样就不用折腾全局权限了,但如果必须写入根目录的MyFolder,就按上面的方法来。
内容的提问来源于stack exchange,提问作者DriveCarefully




