Android 10.0后创建文件createNewFile()和创建文件夹mkdirs()均失败解决方案
昨天往项目中添加Android自定义异常捕获的工具类时(参考# Android自定义崩溃收集器捕获java层和native层崩溃异常日志)碰到一件很诡异的事情,createNewFile一直报no such file or directory,往前追发现是mkdir失败了(mkdirs也一样fail),网上搜了很多都说是AndroidManifest.xml中没有配置读写sd卡的权限(实际上我已经配置了),最后才定位到是android10之后不能问题。
在Android10.0之后创建文件将有严格限制,分区存储,所以对应的权限也要进行修改处理
"android.permission.MOUNT_UNMOUNT_FILESYSTEMS"> "android.permission.WRITE_EXTERNAL_STORAGE"/> "android.permission.READ_EXTERNAL_STORAGE"/>
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 222);
- @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:requestLegacyExternalStorage="true"