Android踩坑——mkdir方法中返回false导致新建文件失败
16lz
2021-01-23
mkdir()方法中返回false导致新建文件失败
String folderName_Right = getExternalCacheDir() + File.separator;String folderName_Wrong = Environment.getExternalStorageDirectory() + File.separator; File folder = new File(folderName);if (!folder.exists()){ folder.mkdir(); }
出错现场:
Android Pie(API 29)
创建新文件的时候,控制台报错:
1.java.io.FileNotFoundException: /storage/emulated/0/test.apk (Permission denied)
2.java.io.FileNotFoundException: /storage/emulated/0/asd/test.apk (No such file or directory)
在写路径的时候若为:Environment.getExternalStorageDirectory() + File.separator + "FileName" + File.separator
的时候报错1
在写路径的时候若为:Environment.getExternalStorageDirectory() + File.separator
的时候报错2
Debug的时候发现出错的地方是mkdir返回的false,mkdir中两个if都没有进去,最后返回false的是createDirectory方法
public boolean mkdir() { SecurityManager security = System.getSecurityManager(); if (security != null) { security.checkWrite(path); } if (isInvalid()) { return false; } return fs.createDirectory(this); }
而createDirectory方法进不去了…
/** * Create a new directory denoted by the given abstract pathname, * returning true
if and only if the operation succeeds.*/public abstract boolean createDirectory(File f);
原因:
具体原因是Android4.4之后,谷歌禁止在非自己应用的文件夹下创建文件或者是文件夹,
System.out.println(getExternalCacheDir().toString()); //这个地方不会报错了System.out.println(getExternalFilesDir(null).toString()); //这个地方不会报错了
两者获得的路径分别是:
/storage/emulated/0/Android/data/packageName/cache /storage/emulated/0/Android/data/packageName/files
所以尽量用这两种方式来获得路径
更多相关文章
- Android实现完整游戏循环的方法
- Android启动外部应用的方法
- Frame-By-Frame Animations的使用方法
- android中获取context的多种方法的区别(this,getbasecontext(),ge
- Android中去掉ActionBar的几种方法
- 反射的方法获取android的Imei
- Android 一些工具类/方法收藏
- Android编程心得---捕捉Home键事件的完美解决方法
- 显示Android当前可用系统内存方法