You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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权限对于保存相机拍摄的图片已经不是必须的,你可以通过MediaStore API直接保存图片,无需申请该权限,这样能简化权限请求逻辑。
  • 如果用户拒绝权限并勾选了「不再询问」,你需要引导用户去应用设置页手动开启权限,可以通过shouldShowRequestPermissionRationale方法判断这种场景。

内容的提问来源于stack exchange,提问作者Vineeth Mohan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 03:46:10