Environment.getExternalStorageDirectory()过时

本文探讨了Android 10后如何避免`Environment.getExternalStorageDirectory()`的过时问题,通过递归搜索找到外部存储根目录,并在AndroidManifest.xml配置`requestLegacyExternalStorage`以获取写权限。然而,结果发现部分设备将文件存储在内置存储,需理解现代设备的存储结构。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

文章目录

1. 前言

希望存储文件在外部存储目录,但是在Android中现在Environment.getExternalStorageDirectory()获取外部存储根目录的方法已经过时,而推荐使用的是:

context.getExternalFilesDir(null)

这个文件目录位于外部SD卡的应用目录中,比如下图:
在这里插入图片描述
但是很明显这个还是应用的私有目录,随着应用的卸载会被删除。所以这里其实不是自己所期望的。孤儿尝试用另一种方式来解决这个问题。

2. 解决

在测试的时候,可以打印一下目录:

context.getExternalFilesDir(null).getAbsolutePath();

结果:

/storage/emulated/0/Android/data/com.weizu.downloader/files

所以其实可以向上层一直搜索,比如下面的代码:

// 调用
File sdCardRoot = findSDCardRoot(context.getExternalFilesDir(null));
File directory = new File(sdCardRoot.toString() + File.separator + cacheDir);

// 申明
private static File findSDCardRoot(File externalFilesDir) {
    File parent;
    boolean equals = (Objects.requireNonNull(parent = externalFilesDir.getParentFile())).getName().equals("0");
    if (!equals) {
        return findSDCardRoot(parent);
    } else {
        return parent;
    }
}

最终得到的目录为:

/storage/emulated/0/wfiledownload/

但是在Android 10及其以后写入外部存储更加严格:

WRITE_EXTERNAL_STORAGE no longer provides write access when targeting Android 10+

可以在AndroidManifest.xml文件中的application标签中配置:

android:requestLegacyExternalStorage="true"

配置了之后,不要忘记了动态权限申请:

// 请求读写权限
if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE)
        != PackageManager.PERMISSION_GRANTED) {
    ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1);
}
if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE)
        != PackageManager.PERMISSION_GRANTED) {
    ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, 1);
}

然后就会顺利弹窗让用户授权。就可以进行外部目录的创建了。

// 目录不存在就创建
if (!directory.exists()) {
    LogUtil.e(directory.getAbsolutePath()+" 目录不存在");
    boolean mkdirs = directory.mkdirs();
    LogUtil.e("创建" + (mkdirs ? "成功" : "失败"));
}

但是,最终在手机上测试发现并没有将文件写入到我的外部SD卡,而是自带的64G的存储空间中。猜测可能现在手机的提供的64G128G等其实就是第一个外部存储SD卡。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

梦否

文章对你有用?不妨打赏一毛两毛

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值