Android系统中,从6.0(API级别23)开始,应用需要在运行时动态请求某些危险权限,其中包括访问摄像头的权限。以下是一个简单的步骤和示例代码来动态获取拍照权限:

1.在AndroidManifest.xml中声明权限:

首先,确保在你的应用manifest文件中声明了CAMERA权限:

   <uses-permission android:name="android.permission.CAMERA" />
   

2.检测权限状态:

在需要使用摄像头的地方,检查是否已经获得了该权限:

   int cameraPermissionCheck = ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA);
   

3.请求权限:

如果没有获得权限,调用requestPermissions()方法:

   if (cameraPermissionCheck != PackageManager.PERMISSION_GRANTED) {
       ActivityCompat.requestPermissions(this,
               new String[]{Manifest.permission.CAMERA},
               REQUEST_CODE_CAMERA_PERMISSION); // 请求码,用于在回调中区分不同的权限请求
   }
   

4.处理权限请求的结果:

重写onRequestPermissionsResult()方法以处理用户对权限请求的响应:

   @Override
   public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
       super.onRequestPermissionsResult(requestCode, permissions, grantResults);

       if (requestCode == REQUEST_CODE_CAMERA_PERMISSION) {
           if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
               // 用户授予了权限,现在可以安全地使用摄像头了
               openCamera();
           } else {
               // 用户拒绝了权限,可能需要向用户解释为何需要这个权限,或者提供没有该权限的备选方案
               Toast.makeText(this, "Permission denied, unable to use camera", Toast.LENGTH_SHORT).show();
           }
       }
   }
   

5.打开相机:

当权限被授予后,你可以启动相机活动或服务来拍照:

   private void openCamera() {
       Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
       if (takePictureIntent.resolveActivity(getPackageManager()) != null) {
           startActivityForResult(takePictureIntent, REQUEST_IMAGE_CAPTURE);
       }
   }

   @Override
   protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
       super.onActivityResult(requestCode, resultCode, data);
       if (requestCode == REQUEST_IMAGE_CAPTURE && resultCode == RESULT_OK) {
           // 处理从相机返回的结果,例如获取Bitmap图片
           Bundle extras = data.getExtras();
           Bitmap imageBitmap = (Bitmap) extras.get("data");
           // ... 进行进一步的操作,比如显示图片或保存到本地
       }
   }
   

请记得替换openCamera()方法中的逻辑以适应你的具体需求,例如处理拍照后的图像数据。

注意:

Android 11(API级别30)及更高版本中,对于外部存储的访问有额外的限制,你可能还需要请求READ_EXTERNAL_STORAGEWRITE_EXTERNAL_STORAGE权限,尽管对于访问媒体库,推荐使用MANAGE_EXTERNAL_STORAGE或特定的媒体内容URI权限。但请注意,MANAGE_EXTERNAL_STORAGE权限在Google Play商店中受到更严格的审查。