拍照模块createTemporaryFile方法曾正常运行,现触发权限拒绝问题
排查createTemporaryFile方法的权限拒绝问题
让我来帮你梳理这个权限拒绝的问题——我之前处理过不少类似的Android存储权限坑,结合你的代码,大概率是这几个原因导致的:
Android存储权限政策的版本变更
你的代码里用了Environment.getExternalStorageDirectory(),这在Android 10(API 29)及以后的系统里会受到严格限制:- Android 6.0+需要动态申请
WRITE_EXTERNAL_STORAGE权限(仅API 28及以下有效); - Android 10+引入了分区存储,APP无法随意访问外部存储根目录,即使申请了旧权限也会被拒绝;
- 你注释掉的
super.getFilesDir()其实是更安全的选择,这是APP的私有内部存储目录,不需要任何额外权限,系统默认允许APP读写自己的内部存储。
- Android 6.0+需要动态申请
外部存储根目录创建文件夹的限制
你在外部存储根目录下创建.temp隐藏目录,在Android 11+(API 30)之后,系统完全禁止APP在外部存储根目录创建自定义文件夹,直接触发权限拒绝。动态权限申请缺失
如果你的APP目标版本还在API 28及以下,且坚持用外部存储,那除了在Manifest里声明权限,还必须在运行时动态申请WRITE_EXTERNAL_STORAGE,否则系统会拒绝访问。
推荐的修复方案
优先使用APP私有内部存储(无需权限,最安全),修改后的代码如下:
private File createTemporaryFile(String part, String ext) throws Exception { // 直接在APP内部存储下创建临时目录 File tempDir = new File(getFilesDir(), ".temp"); if (!tempDir.exists()) { tempDir.mkdirs(); } return File.createTempFile(part, ext, tempDir); }
如果需要将临时文件存在外部存储(比如方便其他APP访问),可以用APP的外部私有存储目录,同样不需要额外权限:
private File createTemporaryFile(String part, String ext) throws Exception { // 获取APP外部私有存储目录 File externalFilesDir = getExternalFilesDir(null); if (externalFilesDir == null) { // 处理外部存储不可用的情况 throw new Exception("External storage is not available"); } File tempDir = new File(externalFilesDir, ".temp"); if (!tempDir.exists()) { tempDir.mkdirs(); } return File.createTempFile(part, ext, tempDir); }
总结
你的代码之前能运行,大概率是因为当时的系统版本较低(API 28及以下),现在系统版本升级后触发了新的权限限制。建议优先使用私有存储方案,避免权限申请的麻烦和兼容性问题。
内容的提问来源于stack exchange,提问作者Ori Zehavi
相关产品推荐
相关产品推荐

