You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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

火山引擎 最新活动