新版Android Studio中相机权限申请失败,求可行代码方案
Android相机权限申请问题
用户提供的错误截图:
当前使用的权限申请代码:
if (ActivityCompat.checkSelfPermission(getApplicationContext(), Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CAMERA}, 0);
环境信息:Gradle版本7.2,插件版本7.1.3
完整的相机权限申请解决方案(兼容Android 6.0+)
1. 先在Manifest中声明权限
打开AndroidManifest.xml,添加相机及相关必要权限:
<uses-permission android:name="android.permission.CAMERA" /> <!-- 如需保存照片到本地,添加以下兼容权限(Android 13+改用READ_MEDIA_IMAGES) --> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="32" /> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" android:maxSdkVersion="32" />
2. 可运行的权限申请完整代码
以下是Activity中实现的完整流程,包含权限检查、申请、回调处理:
private static final int CAMERA_PERMISSION_CODE = 100; // 触发权限申请的方法 private void requestCameraPermission() { // 检查是否已授权 if (ActivityCompat.checkSelfPermission(this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) { // 判断是否需要向用户解释权限用途 if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.CAMERA)) { new AlertDialog.Builder(this) .setTitle("需要相机权限") .setMessage("应用需要相机权限来完成拍照功能,请授予权限") .setPositiveButton("确定", (dialog, which) -> { ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CAMERA}, CAMERA_PERMISSION_CODE); }) .setNegativeButton("取消", null) .show(); } else { // 直接发起权限申请 ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CAMERA}, CAMERA_PERMISSION_CODE); } } else { // 已授权,执行相机操作 startCamera(); } } // 权限申请结果回调 @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); if (requestCode == CAMERA_PERMISSION_CODE) { if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { startCamera(); } else { Toast.makeText(this, "相机权限被拒绝,无法使用相机功能", Toast.LENGTH_SHORT).show(); } } } // 示例:启动相机的方法 private void startCamera() { Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); if (cameraIntent.resolveActivity(getPackageManager()) != null) { startActivityForResult(cameraIntent, 200); } }
3. 关键注意点
- 权限检查时不要用
getApplicationContext(),直接使用当前Activity的上下文this,权限申请需要与Activity绑定; - 权限请求码要保证唯一,避免和其他请求逻辑冲突;
- 若在Fragment中申请权限,直接调用Fragment自带的
requestPermissions()方法,回调在Fragment的onRequestPermissionsResult中处理。
内容的提问来源于stack exchange,提问作者Shahriar Sakib
相关产品推荐
相关产品推荐

