这让我发疯了。我尝试了各种语法,但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);
我在尝试创建文件时得到了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 之后我们不允许在外部存储器中写入,但是还没有找到解决方案。
答案 0 :(得分:2)
仅在您的 targetSdkVersion 29
时适用Environment.getExternalStorageDirectory()在API级别29中已弃用。
要获得相同的功能,请使用此行
File mediaStorageDir = context.getExternalFilesDir(null);
如果您已检查所有可能的错误,请尝试此修复程序。
答案 1 :(得分:1)
创建外部存储目录需要WRITE_EXTERNAL_STORAGE权限;没有此权限,尝试写入外部存储将失败。此外,并非所有目录都必须是可写的;使用getExternalStoragePublicDirectory()获取具有共享写访问权限的目录(其他外部目录可能是只读的)。但是,如果写入外部存储的目的是与其他应用程序共享该文件,则应强烈考虑使用FileProvider API(另请参阅Setting Up File Sharing);使用此策略,您的应用程序将文件存储在其自己的内部应用程序特定目录中,但随后可以通过内容提供商将这些文件选择性地共享给其他应用程序。此策略为文件提供了更高的安全性,还使您可以对文件的读取/写入提供更好的访问控制。
由于您说您已经拥有所需的权限*,因此在调用toString()
时很可能出现错误。无法保证文件上的toString()
方法返回其完整路径。连接这些时,请使用getPath()
或getAbsolutePath()
。在选择写入外部存储时,建议您首先check its state;在某些情况下,外部存储器可以弹出/卸载,不可用。
*您应该使用ContextCompat.checkSelfPermission()进行验证。如果权限不存在,您应该添加对requestPermissions()的调用。
答案 2 :(得分:0)
试试这个:
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上测试权限有变化,你必须在运行时请求其中一些,忽略清单声明)
答案 3 :(得分:0)
另一个可能的原因:API级别29中不推荐使用Environment.getExternalStorageDirectory()
答案 4 :(得分:0)
如果您已经允许了R / W权限(也具有Runtime Permission),但仍然不起作用,请在AndroidManifest.xml中添加下面提到的这一行