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

所以尽量用这两种方式来获得路径

更多相关文章

  1. Android实现完整游戏循环的方法
  2. Android启动外部应用的方法
  3. Frame-By-Frame Animations的使用方法
  4. android中获取context的多种方法的区别(this,getbasecontext(),ge
  5. Android中去掉ActionBar的几种方法
  6. 反射的方法获取android的Imei
  7. Android 一些工具类/方法收藏
  8. Android编程心得---捕捉Home键事件的完美解决方法
  9. 显示Android当前可用系统内存方法

随机推荐

  1. 在 Android(安卓)Native 程序中输出 LOG
  2. android httpClient(https/http)的优化构
  3. android开发之widget控件突然停止更新的
  4. Android中常见的Bug
  5. Android(安卓)SDCard Mount 流程分析
  6. 样式表以及Color.xml文件『Android系列六
  7. 收藏-------Android应用程序组件Content
  8. android 系统核心机制binder(06)binder C++
  9. android客户端和java服务端之间用socket
  10. 纸上得来终觉浅,绝知此事要躬行。Broadcas