Android 10.0后创建文件

Android 10.0后创建文件createNewFile()和创建文件夹mkdirs()均失败解决方案

昨天往项目中添加Android自定义异常捕获的工具类时(参考# Android自定义崩溃收集器捕获java层和native层崩溃异常日志)碰到一件很诡异的事情,createNewFile一直报no such file or directory,往前追发现是mkdir失败了(mkdirs也一样fail),网上搜了很多都说是AndroidManifest.xml中没有配置读写sd卡的权限(实际上我已经配置了),最后才定位到是android10之后不能问题。

在Android10.0之后创建文件将有严格限制,分区存储,所以对应的权限也要进行修改处理

  • 在AndroidManifest.xml中添加对应的权限
java 复制代码
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS">
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
  • 在使用的地方发起请求,系统会有一个弹窗,提示是否允许读写权限
java 复制代码
 ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 222);  
  • 选择弹窗的允许后,会触发onRequestPermissionsResult这个函数,重写这个函数,添加自己的特定需求
java 复制代码
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
        if (!hasAllPermissionsGranted(grantResults)) {
            return;
        }
        switch (requestCode) {
            case 222:
                Toast.makeText(getApplicationContext(), "已申请权限", Toast.LENGTH_SHORT).show();
            default:
                super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        }
    }

之后 在需要的地方创建文件夹,即可。

但是Android10之后Google默认不允许随意创建文件夹。这是因为Android10及之后将执行分区存储,只能操作Google规定的自己应用目录下的文件,所以要对之前的应用数据进行迁移。好在Android10是个过渡期,开发者可以使用下面三种解决方式来暂时忽略分区存储。但是Android11将强制执行分区存储。所以在Android10的时候就先对自己之前的数据做迁移吧。

解决方法有三个:

  • 使用Android规定的文件夹做操作
  • 将gradle中的编译环境,SDK的版本号修改到29以下
  • 清单文件加入下面这句停用分区存储即可随意创建文件夹
java 复制代码
//停用分区存储
android:requestLegacyExternalStorage="true"

原文链接:Android 10.0后创建文件 - 掘金 (juejin.cn)

相关推荐
paeamecium1 小时前
【PAT甲级真题】- Rational Sum (20)
数据结构·c++·python·算法·pat考试·pat
zhangjin11202 小时前
解决Android Studio gradle下载超时和缓慢问题(二)
android·ide·android studio
Highcharts.js8 小时前
教程:基于 React + Highcharts 构建一个单页应用程序、按需数据拉取与图表渲染
开发语言·前端·数据结构·react.js·前端框架·highcharts·页面应用
爱昏羔8 小时前
下篇:从检索到交互 — 物流RAG问答系统与WebUI全实现
python·langchain·agent
_Jimmy_8 小时前
Agent引用数据库知识过时的增量同步方案
人工智能·python·langchain
头发还在的女程序员9 小时前
医院陪诊管理系统怎么选择?——2026 年选型避坑与架构参考
java·开发语言·陪诊系统·陪诊app·医院陪诊陪护
min(a,b)9 小时前
学习第 4 天:面向对象与异常处理
python·学习·学习方法
xingxiliang10 小时前
深入浅出 Android CTS 视频测试:从环境搭建、用例设计到底层通信原理
android·音视频
我命由我1234510 小时前
Android 开发问题:为 PDFView 设置一个带有黑色边框的背景 drawable,但边框没有生效
android·java·java-ee·android studio·android jetpack·android-studio·android runtime
爱写代码的小朋友11 小时前
从零开始学 Win32 API:C++ 窗口编程实战(VS Code + MinGW-w64 命令行详解)
开发语言·c++