为何调用save方法后该Android程序出现崩溃?
调用save方法后程序崩溃的原因及修复方案
咱们先从你给出的Manifest配置入手分析核心问题:
你声明的WRITE_EXTERNAL_STORAGE权限加了android:maxSdkVersion="18",这个属性的作用是仅限Android 4.3(API 18)及更低版本的系统会授予该权限。而Android 4.4(API 19)及以上的设备,系统会直接忽略这个权限申请,不会给你的App授予写入外部存储的权限。
具体崩溃场景
- 运行在API 19+设备上时:
如果你的save方法尝试写入外部存储中需要权限的路径(比如SD卡根目录、其他App的私有存储目录),因为没有权限,系统会抛出SecurityException,直接导致程序崩溃。
这里要注意:API 19+之后,写入你自己App的外部私有目录(比如通过getExternalFilesDir()获取的路径)是不需要WRITE_EXTERNAL_STORAGE权限的,但如果你的save方法写的是其他路径,就会触发权限问题。 - 其他潜在崩溃点(结合常规情况推测):
- 如果
save方法里没做文件路径的空判断,当外部存储未挂载时,获取的路径为null,执行文件操作会抛出NullPointerException。 - 没处理IO异常:文件写入时如果遇到磁盘满、文件被占用等情况,没捕获
IOException也会导致崩溃。
- 如果
修复建议
- 调整权限配置:
- 要是你的App需要在API 19+设备上写入非私有外部存储路径,直接删掉
android:maxSdkVersion="18",并且在Android 6.0(API 23)及以上的设备上,记得要动态申请权限(不能只靠Manifest声明)。 - 要是只需要写入自己App的外部私有目录,完全可以移除
WRITE_EXTERNAL_STORAGE权限,因为API 19+系统默认允许App访问这个路径。
- 要是你的App需要在API 19+设备上写入非私有外部存储路径,直接删掉
- 完善
save方法的健壮性:- 先检查外部存储状态,确保已挂载:
Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)。 - 对文件路径做非空判断,避免空指针。
- 捕获
IOException和SecurityException,给用户友好提示而不是直接崩溃。
- 先检查外部存储状态,确保已挂载:
内容的提问来源于stack exchange,提问作者Adu Fordjour Precious
相关产品推荐
相关产品推荐

