Android调用相机触发权限拒绝错误的技术求助
解决Android相机调用的SecurityException权限问题
这个问题我之前排查过很多次,核心是你的权限检查逻辑错误导致的,来一步步解决:
1. 修复权限检查的逻辑错误
你当前的代码用了&&(逻辑与),意思是「只有当相机和存储权限都未授权时」才去请求权限。但如果其中一个权限已授权、另一个未授权,代码会直接进入else块启动相机,这时候未授权的权限就会触发SecurityException。
把逻辑改成||(逻辑或),也就是「只要有一个权限未授权」就请求权限:
// 修正后的权限检查代码 if (ActivityCompat.checkSelfPermission(activity, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED || ActivityCompat.checkSelfPermission(activity, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(activity, new String[]{Manifest.permission.CAMERA, Manifest.permission.WRITE_EXTERNAL_STORAGE}, Constants.CAMERA_CAPTURE_PERMISSIONS_REQUEST_CODE); } else { Intent camera = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE); activity.startActivityForResult(camera, Constants.IMAGE_CAPTURE_CAMERA); }
2. 完善权限回调的处理逻辑
你的回调代码没写完,需要完整判断权限是否被用户授予,再决定是否启动相机:
@SuppressLint("NewApi") @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); // 匹配相机权限请求的Code if (requestCode == Constants.CAMERA_CAPTURE_PERMISSIONS_REQUEST_CODE) { // 检查两个权限的授权状态 boolean isCameraGranted = grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED; boolean isStorageGranted = grantResults.length > 1 && grantResults[1] == PackageManager.PERMISSION_GRANTED; if (isCameraGranted && isStorageGranted) { // 权限全部授予,启动相机 Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); startActivityForResult(cameraIntent, Constants.IMAGE_CAPTURE_CAMERA); } else { // 至少一个权限被拒绝,给用户提示 Toast.makeText(this, "需要相机和存储权限才能使用该功能", Toast.LENGTH_SHORT).show(); } } }
3. 额外优化建议(针对高版本Android)
- 从**Android 10(API 29)**开始,
WRITE_EXTERNAL_STORAGE权限对于保存相机拍摄的图片已经不是必须的,你可以通过MediaStoreAPI直接保存图片,无需申请该权限,这样能简化权限请求逻辑。 - 如果用户拒绝权限并勾选了「不再询问」,你需要引导用户去应用设置页手动开启权限,可以通过
shouldShowRequestPermissionRationale方法判断这种场景。
内容的提问来源于stack exchange,提问作者Vineeth Mohan
相关产品推荐
相关产品推荐

