这真让我抓狂。我已经尝试了各种语法,但两者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之后我们不允许在外部存储中写入,但还没有找到解决方案。
创建外部存储目录需要WRITE_EXTERNAL_STORAGE权限;没有此权限,尝试写入外部存储将失败。此外,并非所有目录都必须可写;使用getExternalStoragePublicDirectory()获取具有共享写访问权限的目录(其他外部目录可能是只读的)。但是,如果写入外部存储的目的是与其他应用程序共享文件,则应强烈考虑使用FileProvider API,而不是(另请参阅设置文件共享); 使用此策略,您的应用程序将文件存储在其自己的内部特定于应用程序的目录中,然后通过内容提供程序将这些文件选择性地共享给其他应用程序。此策略为文件提供了更高的安全性,并使您可以对文件的读/写提供更好的访问控制。
既然您说您已经拥有所需的权限*,那么您最有可能出错的地方是对toString()
. 不能保证toString()
文件上的方法返回其完整路径。在连接这些时使用getPath()
或getAbsolutePath()
。还建议在选择写入外部存储时,首先检查其状态;在某些情况下,外部存储可以弹出/卸载并且不可用。
*您应该使用ContextCompat.checkSelfPermission()验证这一点。如果权限不存在,您应该添加对requestPermissions()的调用。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句