Android中MkDirs及文件保存失败问题求助
解决Android 8.1.0 Pixel 2 XL上存储写入失败的问题
我之前在处理Android 8.1(API 27)设备的存储问题时碰到过几乎一模一样的情况——哪怕提前申请并校验了读写权限,不管是调用mkdirs()创建目录还是直接写入文件(包括系统的DIRECTORY_DOWNLOADS目录)都失败。结合当时的排查经验,给你几个实用的方向:
1. 先确认权限申请真的没问题
虽然你说Activity启动前已经校验了权限,但还是得再仔细核对:
- 是不是同时申请了
READ_EXTERNAL_STORAGE和WRITE_EXTERNAL_STORAGE?这俩都是Android 6.0+的危险权限,必须明确请求,而且要确保用户都授权了,缺一个都可能出问题。 - 权限请求的代码有没有疏漏?比如:
String[] storagePermissions = { Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE }; if (ContextCompat.checkSelfPermission(this, storagePermissions[0]) != PackageManager.PERMISSION_GRANTED || ContextCompat.checkSelfPermission(this, storagePermissions[1]) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(this, storagePermissions, YOUR_REQUEST_CODE); }
- 另外,Android 8.1对WRITE权限的范围有一定限制,但
DIRECTORY_DOWNLOADS属于公共可写目录,理论上没问题,不过还是要确认路径是否正确。
2. 别手动拼路径,用系统API获取正确目录
很多时候失败都是因为路径写错了,千万不要直接写/sdcard/Download这种硬编码路径,不同设备的外部存储根目录可能不一样。正确获取DIRECTORY_DOWNLOADS的方式是:
// 公共Download目录(所有应用都能访问) File publicDownloadDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS); // 或者应用专属的外部Download目录(卸载APP会删除,无需WRITE权限) File appDownloadDir = getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS);
而且调用mkdirs()后一定要判断返回值,确认目录创建成功:
if (!publicDownloadDir.exists() && !publicDownloadDir.mkdirs()) { Log.e("StorageDebug", "创建公共Download目录失败"); return; }
3. 检查外部存储状态和磁盘情况
有时候不是权限的锅,是外部存储本身有问题:
- 用
Environment.getExternalStorageState()检查存储是否挂载正常:
if (!Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())) { Log.e("StorageDebug", "外部存储未挂载或不可用"); return; }
- 顺便检查一下设备的磁盘空间是不是满了,存储空间不足也会导致写入失败。
4. 抓日志找具体错误原因
上面的方法都试过还不行的话,一定要看Logcat的错误日志,这是最直接的排查方式。建议在写入文件的代码里加个try-catch,把错误信息打出来:
try { File testFile = new File(publicDownloadDir, "test_write.txt"); FileWriter writer = new FileWriter(testFile); writer.write("测试内容"); writer.close(); } catch (IOException e) { e.printStackTrace(); Log.e("StorageError", "写入失败原因: " + e.getMessage()); }
比如如果日志里出现PermissionDeniedException,那还是权限的问题;如果是No such file or directory,那就是路径没创建对;如果是Disk full,那就是磁盘空间不足。根据日志信息再针对性解决就行。
如果公共目录实在搞不定,可以试试应用专属的外部存储路径(就是上面提到的getExternalFilesDir()方法),这个路径不需要WRITE_EXTERNAL_STORAGE权限(Android 4.4+),写入成功率很高,适合不需要和其他应用共享的文件。
内容的提问来源于stack exchange,提问作者pancodemakes
相关产品推荐
相关产品推荐

