Environment.getExternalStorageDirectory()过时
文章目录
- 1. 前言
- 2. 解决
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
的存储空间中。猜测可能现在手机的提供的64G
、128G
等其实就是第一个外部存储SD
卡。
Environment.getExternalStorageDirectory()过时相关推荐
- Android:Environment.getExternalStorageDirectory 废弃
使用Android SDK 版本超过29编译会发现这个方法被废弃了,解决方案是: context.getExternalFilesDir() ----------- 比如要把图片保存到手机的指定文件夹 ...
- adnroid 29 Environment.getExternalStorageDirectory().getAbsolutePath() 无法获取路径
adnroid 29 Environment.getExternalStorageDirectory().getAbsolutePath() 无法获取路径 最近在上传相机项目到GooglePlay ...
- Do not hardcode /sdcard/; use Environment.getExternalStorageDirectory().ge
刚开始我写了file=new File("/sdcard/ninan.mp3")但是出现了警告Do not hardcode "/sdcard/"; use E ...
- 【开源项目】Android开发内置App自动升级
1.准备工作,首先需要在AndroidManifest.xml中的application中加入以下内容 <providerandroid:name="android.support.v ...
- Android Environment 的作用以及常用的方法
从源码中可以看到这样一句话 Provides access to environment variables Environment的作用是: 提供对环境变量的访问 常见的方法 //外部存储设备的当 ...
- Android—SDCard数据存取Environment简介
1:Environment简介: Environment是android.os包下的一个类,谷歌官方文旦的解释为:Provides access to environment variables(提供 ...
- android数据持久化框架,Android:数据持久化、Environment、SharedPreferences、内部存储internalStorage...
1.数据持久化-SDCard//数据持久化-SDCard findViewById(R.id.button1).setOnClickListener(new OnClickListener() { @ ...
- Android:数据持久化、Environment、SharedPreferences、内部存储internalStorage
1.数据持久化-SDCard //数据持久化-SDCard findViewById(R.id.button1).setOnClickListener(new OnClickListener() {@ ...
- Android应用开发:数据存储和界面展现-1
1. 相对布局RelativeLayout 特点:相对布局所有组件可以叠加在一起:各个组件的布局是独立的,互不影响:所有组件的默认位置都是在左上角(顶部.左部对齐) 属性 功能描述 android:l ...
最新文章
- 【转载】Asp.Net 全生命周期
- CSS、JavaScript、PHP和Python编程合二为一
- 第十五届全国大学生智能汽车竞赛竞速赛规则(讨论稿)
- 分析:Java的好处究竟在哪里?
- 学习 lodash 源码整体架构,打造属于自己的函数式编程类库
- ASPNET Core 2.x中的Kestrel服务器
- 特斯拉得克萨斯超级工厂正式开业 计划明年开始生产电动皮卡
- 【component: resolve => require([‘../pages/home.vue‘], resolve)-装载】
- vba遍历字符串_EXCEL 公式 遍历查找 查找字符串
- QT将窗体变为顶层窗体
- Netty创建upd服务端
- 软件项目管理随谈(2)——项目合同问题
- 游戏加速器安卓apk代码
- 5次Shift破解Win7登录密码
- 最新bilibili怎么下载视频
- nginx启动提示nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
- 97. Interleaving String
- 安卓逆向——AS开发Xposed插件HOOK案例
- Java中 VO、PO、DO、DTO、BO、QO、DAO、POJO的概念
- 什么是用户故事地图?