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

Android mkdir() returns false, doesn't create folder

这让我发疯。我尝试了各种语法,但 mkdir()mkdirs() return 都是错误的。

我的代码:

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);

我在尝试创建文件时得到 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());

以及打印的内容:

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

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

试试这个:

String extStorageDirectory = Environment.getExternalStorageDirectory().toString();
File folder = new File(extStorageDirectory, "pdf");
folder.mkdir();

在清单中:

<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com....">
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

此外,如果您在 android 6.0 + api 23 上进行测试,则权限会发生变化,您必须在运行时请求其中一些权限,清单声明将被忽略)

创建外部存储目录需要 WRITE_EXTERNAL_STORAGE permission; without this permission, attempts to write external storage will fail. Also, not all directories are necessarily writable; use getExternalStoragePublicDirectory() to get a directory that has shared write access (other external directories may be read-only). However, if the purpose of writing to external storage is to share the file with other applications, you should strongly consider using the FileProvider API, instead (see also Setting Up File Sharing);使用此策略,您的应用程序将文件存储在其自己的内部特定于应用程序的目录中,但随后可以通过内容提供商选择性地将这些文件共享给其他应用程序。此策略为文件提供了更高的安全性,还使您可以对 reading/writing 文件提供更好的访问控制。

既然你说你已经拥有所需的权限*,那么你出错的地方很可能是在对 toString() 的调用中。无法保证文件 returns 上的 toString() 方法是其完整路径。连接这些时使用 getPath()getAbsolutePath()。还建议在选择写入外部存储时,首先 check its state;在某些情况下,外部存储可能 ejected/unmounted 并且不可用。

*如果权限不存在,您应该使用 ContextCompat.checkSelfPermission(). You should add a call to requestPermissions() 进行验证。

另一个可能的原因:Environment.getExternalStorageDirectory() 在 API 级别 29

中已弃用

仅适用于您的 targetSdkVersion 29

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

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

File mediaStorageDir = context.getExternalFilesDir(null);

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

如果您已经允许 R/W 权限(也有运行时权限)但仍然不起作用,请在您的 AndroidManifest.xml

中添加下面提到的行

注意:如果你的目标是 Android 10+,这必须是必需的

只需删除 .toString() 如:

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

String extStorageDirectory = Environment.getExternalStorageDirectory();