文章目录

  • 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的存储空间中。猜测可能现在手机的提供的64G128G等其实就是第一个外部存储SD卡。

Environment.getExternalStorageDirectory()过时相关推荐

  1. Android:Environment.getExternalStorageDirectory 废弃

    使用Android SDK 版本超过29编译会发现这个方法被废弃了,解决方案是: context.getExternalFilesDir() ----------- 比如要把图片保存到手机的指定文件夹 ...

  2. adnroid 29 Environment.getExternalStorageDirectory().getAbsolutePath() 无法获取路径

    adnroid 29 Environment.getExternalStorageDirectory().getAbsolutePath() 无法获取路径 ​ 最近在上传相机项目到GooglePlay ...

  3. Do not hardcode /sdcard/; use Environment.getExternalStorageDirectory().ge

    刚开始我写了file=new File("/sdcard/ninan.mp3")但是出现了警告Do not hardcode "/sdcard/"; use E ...

  4. 【开源项目】Android开发内置App自动升级

    1.准备工作,首先需要在AndroidManifest.xml中的application中加入以下内容 <providerandroid:name="android.support.v ...

  5. Android Environment 的作用以及常用的方法

    从源码中可以看到这样一句话 Provides access to environment variables Environment的作用是:  提供对环境变量的访问 常见的方法 //外部存储设备的当 ...

  6. Android—SDCard数据存取Environment简介

    1:Environment简介: Environment是android.os包下的一个类,谷歌官方文旦的解释为:Provides access to environment variables(提供 ...

  7. android数据持久化框架,Android:数据持久化、Environment、SharedPreferences、内部存储internalStorage...

    1.数据持久化-SDCard//数据持久化-SDCard findViewById(R.id.button1).setOnClickListener(new OnClickListener() { @ ...

  8. Android:数据持久化、Environment、SharedPreferences、内部存储internalStorage

    1.数据持久化-SDCard //数据持久化-SDCard findViewById(R.id.button1).setOnClickListener(new OnClickListener() {@ ...

  9. Android应用开发:数据存储和界面展现-1

    1. 相对布局RelativeLayout 特点:相对布局所有组件可以叠加在一起:各个组件的布局是独立的,互不影响:所有组件的默认位置都是在左上角(顶部.左部对齐) 属性 功能描述 android:l ...

最新文章

  1. 【转载】Asp.Net 全生命周期
  2. CSS、JavaScript、PHP和Python编程合二为一
  3. 第十五届全国大学生智能汽车竞赛竞速赛规则(讨论稿)
  4. 分析:Java的好处究竟在哪里?
  5. 学习 lodash 源码整体架构,打造属于自己的函数式编程类库
  6. ASPNET Core 2.x中的Kestrel服务器
  7. 特斯拉得克萨斯超级工厂正式开业 计划明年开始生产电动皮卡
  8. 【component: resolve => require([‘../pages/home.vue‘], resolve)-装载】
  9. vba遍历字符串_EXCEL 公式 遍历查找 查找字符串
  10. QT将窗体变为顶层窗体
  11. Netty创建upd服务端
  12. 软件项目管理随谈(2)——项目合同问题
  13. 游戏加速器安卓apk代码
  14. 5次Shift破解Win7登录密码
  15. 最新bilibili怎么下载视频
  16. nginx启动提示nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
  17. 97. Interleaving String
  18. 安卓逆向——AS开发Xposed插件HOOK案例
  19. Java中 VO、PO、DO、DTO、BO、QO、DAO、POJO的概念
  20. 什么是用户故事地图?

热门文章

  1. 学习 Bootstrap 5 之 Text
  2. 小i智慧学堂走进香港:AI再定义联络中心
  3. Python数据类型,if语句
  4. 微信小程序开发的数据绑定和事件绑定
  5. android spen加背景网页,Android SPen SDK检索悬停点
  6. PS 图像调整算法——黑白
  7. 基于Java毕业设计超市货品进销存系统后台源码+系统+mysql+lw文档+部署软件
  8. EPSG竟然是个“石油组织”?
  9. IIC通信从机无应答(读取数据始终为0XFF)
  10. Java8 ArrayBlockingQueue 源码解析