写入应用缓存目录触发Permission Denied错误的解决求助
解决华为4x设备缓存目录Permission Denied问题
我之前碰到过类似的华为设备存储权限异常情况,结合你的报错信息和代码,给你几个实用的排查和解决方向:
1. 增加外置SD卡的可写性校验
你的代码目前只判断getExternalCacheDir()是否为空,但这个目录可能指向外置SD卡。如果SD卡处于只读状态(比如卡损坏、系统挂载限制),就会导致写入失败。建议补充SD卡可写性检查:
public File provide() { File externalCache = mContext.getExternalCacheDir(); File cacheDir; // 先判断外置SD卡是否可正常读写,不可用则直接 fallback 到内置缓存目录 boolean isExternalWritable = Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED); if (externalCache != null && isExternalWritable) { cacheDir = externalCache; } else { cacheDir = mContext.getCacheDir(); } if (!cacheDir.exists()) { // 必须校验目录创建是否成功,避免创建失败后继续写入 boolean isCreated = cacheDir.mkdirs(); if (!isCreated) { // 可在此处添加日志记录,兜底返回内置缓存目录 return mContext.getCacheDir(); } } return cacheDir; }
2. 适配华为设备的特殊权限逻辑
虽然Android官方文档明确说明应用自身的缓存目录无需申请存储权限,但部分华为旧系统版本存在权限逻辑bug。你可以尝试:
- 手动进入应用设置,确认「存储」权限是否开启(即使理论上不需要);
- 针对华为设备额外动态申请
WRITE_EXTERNAL_STORAGE权限(仅适用于Android 9及以下版本,Android 10+分区存储下此权限无效)。
3. 尝试替换为getExternalFilesDir作为备选
如果getExternalCacheDir()仍然报错,可以改用应用私有文件目录的缓存子目录:
File alternativeCacheDir = mContext.getExternalFilesDir(Environment.DIRECTORY_CACHE);
这个目录同样属于应用私有空间,无需额外权限,部分华为设备对这个目录的兼容性更好。
4. 手动验证目录的可访问性
从报错路径/storage/3C11-1816/Android/data/{my app package}/cache/...来看,这是外置SD卡的应用私有目录。你可以尝试手动在该路径下创建一个测试文件,判断是代码逻辑问题还是系统层面的权限限制。
内容的提问来源于stack exchange,提问作者nikita.zhelonkin
相关产品推荐
相关产品推荐

