Android拍照APP点击按钮崩溃:动态申请存储媒体权限后异常
问题分析与解决方案
这种授权后立即点击拍照崩溃、重启后正常的情况,核心原因是权限授予后代码未实时刷新权限状态,或依赖权限的资源未重新初始化,导致逻辑判断与实际权限状态不匹配。以下是具体解决步骤:
权限回调中强制校验真实权限状态
不要直接使用权限申请回调的结果执行拍照逻辑,必须通过ContextCompat.checkSelfPermission()重新确认权限是否真的被授予,避免系统回调延迟或缓存问题。示例代码:// 采用AndroidX推荐的ActivityResultAPI处理权限 ActivityResultLauncher<String[]> permissionLauncher = registerForActivityResult( new ActivityResultContracts.RequestMultiplePermissions(), result -> { // 强制重新校验权限,而非直接用回调结果 boolean cameraOk = ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA) == PackageManager.PERMISSION_GRANTED; boolean storageOk = ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED; if (cameraOk && storageOk) { // 确认权限后再初始化拍照组件并执行操作 startCameraProcess(); } } );延迟初始化依赖权限的资源
禁止在onCreate等早期生命周期中初始化相机实例、FileProvider Uri生成器等依赖权限的资源,这些操作必须等到权限确认授予后再执行。拍照按钮的逻辑要分两步:takePhotoBtn.setOnClickListener(v -> { if (checkPermissions()) { startCameraProcess(); } else { permissionLauncher.launch(new String[]{Manifest.permission.CAMERA, Manifest.permission.WRITE_EXTERNAL_STORAGE}); } }); // 独立的权限检查方法 private boolean checkPermissions() { return ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA) == PackageManager.PERMISSION_GRANTED && ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED; }清除权限状态缓存
如果代码中有用全局变量(如isPermissionGranted)缓存权限状态,在权限回调中必须用checkSelfPermission的结果强制更新该变量,不能依赖回调结果直接赋值,避免缓存与实际状态不一致。适配Android 13+媒体权限
针对Android 13及以上版本,不再申请旧的WRITE_EXTERNAL_STORAGE权限,改用READ_MEDIA_IMAGES/READ_MEDIA_VIDEO等细分媒体权限,否则会出现权限状态识别异常。
内容的提问来源于stack exchange,提问作者Jatin .aitech
相关产品推荐
相关产品推荐

