Android已声明相机权限仍无法调用相机,求解决方案
解决相机权限拒绝问题
兄弟,你遇到的这个权限拒绝错误,核心原因是权限判断逻辑完全写反了!我们一步步来梳理和修正:
问题根源分析
先看你代码里的判断逻辑:
int camera = ContextCompat.checkSelfPermission(mContext, android.Manifest.permission.CAMERA); if (camera != PackageManager.PERMISSION_GRANTED) { // 没权限的时候直接启动拍照Intent,系统直接拦截并抛出权限拒绝错误 Intent intent= new Intent(MediaStore.ACTION_IMAGE_CAPTURE); startActivityForResult(intent, REQUEST_IMAGE_CAPTURE); } else{ // 有权限的时候反而去申请权限,完全搞反了流程 ActivityCompat.requestPermissions((Activity) mContext, new String[]{android.Manifest.permission.CAMERA}, 9); }
错误日志里的Permission Denial就是因为你在未获取相机权限的情况下,直接调用了需要权限的拍照Intent,系统自然会拒绝这个请求。
修正后的代码
正确的流程应该是:先检查权限,无权限则申请,有权限再启动拍照。修正后的代码如下:
case R.id.textViewTakePhoto: try { Utility.showPopupMenuWindow(mContext, false, mPopupWindow); int cameraPermission = ContextCompat.checkSelfPermission(mContext, android.Manifest.permission.CAMERA); if (cameraPermission != PackageManager.PERMISSION_GRANTED) { // 没有权限,先申请相机权限 ActivityCompat.requestPermissions((Activity) mContext, new String[]{android.Manifest.permission.CAMERA}, 9); // 自定义请求码,后续处理结果会用到 } else { // 已获取权限,直接启动拍照Intent Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); startActivityForResult(intent, REQUEST_IMAGE_CAPTURE); } } catch (Exception e) { Log.e(TAG, "Can't access camera: " + e.getMessage()); e.printStackTrace(); } break;
补充:处理权限申请结果
你还需要在Activity中重写onRequestPermissionsResult方法,处理用户是否同意权限的情况:
@Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); if (requestCode == 9) { // 对应申请权限时的请求码 if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { // 用户同意权限,启动拍照 Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); startActivityForResult(intent, REQUEST_IMAGE_CAPTURE); } else { // 用户拒绝权限,提示用户需要权限才能操作 Toast.makeText(mContext, "需要相机权限才能拍摄头像", Toast.LENGTH_SHORT).show(); } } }
额外注意事项
- 你的Manifest文件中权限和硬件特性的声明是正确的,无需修改;
- 由于你使用的
compileSdkVersion是25(Android 7.1),上述权限处理逻辑完全适配该版本; - 确保
REQUEST_IMAGE_CAPTURE是全局常量(比如private static final int REQUEST_IMAGE_CAPTURE = 1;),方便后续在onActivityResult中处理拍照结果。
内容的提问来源于stack exchange,提问作者priyanka.p prabhakar




