Android mkdir() 返回 false,不创建文件夹

use*_*582 4 directory android android-external-storage

这真让我抓狂。我已经尝试了各种语法,但两者mkdir()mkdirs()返回FALSE。

我的代码:

String extStorageDirectory = Environment.getExternalStorageDirectory().toString();

File folder = new File(extStorageDirectory, "myportal");
boolean bool = folder.mkdir();

File pdfFile = new File(folder, fileName);

try{
    pdfFile.createNewFile();
}catch (IOException e){
    e.printStackTrace();
}
FileDownloader.downloadFile(fileUrl, pdfFile);
Run Code Online (Sandbox Code Playgroud)

我正在IOException: No such file or directory尝试创建文件时。logcat 部分显示没有创建目录:

Log.d("BG", "URL: " + fileUrl);
Log.d("BG", "pdfFile: " + pdfFile);
Log.d("BG", "Ext Storage: " + extStorageDirectory);
Log.d("BG", "Ext storage state: " + Environment.getExternalStorageState().toString());
Log.d("BG", "Mkdir return: " + bool);
Log.d("BG", "IsDirectory: " + folder.isDirectory());
Run Code Online (Sandbox Code Playgroud)

以及打印的内容:

05-26 22:43:03.797 19364-30646/com.kristmiha.myportal2 D/BG: URL: http://192.168.100.65:80/myportal/upload/orari.pdf
05-26 22:43:03.798 19364-30646/com.kristmiha.myportal2 D/BG: pdfFile: /storage/emulated/0/myportal/orari.pdf
05-26 22:43:03.798 19364-30646/com.kristmiha.myportal2 D/BG: Ext Storage: /storage/emulated/0
05-26 22:43:03.804 19364-30646/com.kristmiha.myportal2 D/BG: Ext storage state: mounted
05-26 22:43:03.805 19364-30646/com.kristmiha.myportal2 D/BG: Mkdir return: false
05-26 22:43:03.805 19364-30646/com.kristmiha.myportal2 D/BG: IsDirectory: false
Run Code Online (Sandbox Code Playgroud)

我已经仔细检查了权限,并将它们放在正确的位置。我想我在某处读到在KitKat之后我们不允许在外部存储中写入,但还没有找到解决方案。

Mic*_*yan 5

创建外部存储目录需要WRITE_EXTERNAL_STORAGE权限;如果没有此权限,尝试写入外部存储将会失败。此外,并非所有目录都必须是可写的;使用getExternalStoragePublicDirectory()获取具有共享写访问权限的目录(其他外部目录可能是只读的)。但是,如果写入外部存储的目的是与其他应用程序共享文件,则您应该强烈考虑使用 FileProvider API(另请参阅设置文件共享);通过此策略,您的应用程序将文件存储在其自己的内部特定于应用程序的目录中,但随后可以通过内容提供商选择性地将这些文件共享给其他应用程序。此策略为文件提供了更高的安全性,并且还使您可以对文件的读/写提供更大的访问控制。

既然您说您已经拥有所需的权限*,那么您出错的地方很可能是在对 的调用中toString()。无法保证toString()文件上的方法返回其完整路径。连接这些时使用getPath()or 。getAbsolutePath()当选择写入外部存储时,建议您首先检查其状态;在某些情况下,外部存储可能会弹出/卸载并且不可用。

*您应该使用ContextCompat.checkSelfPermission()验证这一点。如果权限不存在,您应该添加对requestPermissions()的调用。


Pri*_*ary 5

仅当您的targetSdkVersion 29 时适用

Environment.getExternalStorageDirectory() 在 API 级别 29 中已弃用。

要获得相同的功能,请使用此行

File mediaStorageDir = context.getExternalFilesDir(null);
Run Code Online (Sandbox Code Playgroud)

如果您已检查所有可能的错误,请尝试此修复程序。