Android踩坑——mkdir方法中返回false导致新建文件失败

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)