Android 8.1.0(Oreo)中mkdirs创建外部存储目录失败求助
兄弟,你这个问题我之前帮好几个开发者解决过,核心原因是Android 8.1(API 27)开始的存储权限和路径限制变化——虽然Scoped Storage是Android 10才全面推行,但8.1已经埋下了一些限制的伏笔。结合你说的7.1.1正常、权限已授予的情况,我给你梳理几个大概率的问题点和解决办法:
1. 别再直接用公共外部存储根目录创建自定义文件夹了
Android 8.1开始,系统对Environment.getExternalStorageDirectory()这类公共存储根目录的写入限制变严格了。如果你是直接在/sdcard下创建自己的目录(比如/sdcard/MyAppImages),这种操作在8.1上很大概率会被拒绝,因为官方现在更推荐用应用专属的外部存储目录。
换个正确的路径试试,比如专门存图片的应用专属目录:
// 获取应用专属的图片存储目录,然后创建子文件夹 File customImageDir = new File(getExternalFilesDir(Environment.DIRECTORY_PICTURES), "MyCustomFolder"); boolean isCreated = customImageDir.mkdirs();
这个路径属于应用私有区域,不需要额外申请WRITE权限(系统会自动授予),而且卸载应用时这些文件会被自动清理,在8.1及以上版本都能稳定工作。
2. 确认权限获取的时机是否正确
虽然你说权限已经授予,但最好再检查下代码逻辑:是不是在权限申请的回调(onRequestPermissionsResult)确认权限通过后,才执行的mkdirs()?如果是在权限还没拿到的时候就调用了,那肯定会失败——7.1.1对权限时机的检查没那么严格,但8.1卡得更死。
3. 试试手动创建路径排查问题
你可以先把代码里要创建的目录路径打印出来,然后用ADB命令手动创建试试:
adb shell mkdir -p /你要创建的路径
如果手动创建也失败,说明这个路径本身是系统保护的,根本不让写;如果手动能成功,那就是代码里的逻辑有问题(比如权限时机、路径拼写错误)。
4. 排查是否有厂商定制的存储限制
有些国内厂商会在Android 8.1上额外加一层存储限制,哪怕你有官方权限也不让写公共目录。这种情况下,要么换成应用专属目录(推荐),要么就得用SAF(存储访问框架)让用户手动授权目录访问,但这会增加用户操作步骤,不是最优解。
总结一下,90%的概率是你用了公共存储的自定义目录导致的,换成应用专属的外部存储目录应该就能解决问题。
内容的提问来源于stack exchange,提问作者Tako




