You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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

火山引擎 最新活动