如何在Android中获取摄像头权限(特别是Marshmallow)

69

嘿,我正在使用Android Studio设计一个应用。其中我需要相机权限。我已经在AndroidManifest.xml文件中包含了<uses-permission android:name="android.permission.CAMERA" />。它在除了Marshmallow版本之外的所有版本中都可以正常工作。如何默认获取相机权限?如果不可能的话,如何向用户请求权限?


2
请参考此链接:https://github.com/sagarjogadia28/PermissionSample/blob/master/app/src/main/java/sagarjogadia28/com/permissionsample/MainActivity.java - Sagar Jogadia
2
试一下这个,可能会起作用 https://dev59.com/J1wX5IYBdhLWcg3w-Thv#41221852 - Bipin Bharti
9个回答

95

首先检查用户是否已经授权:

if (ContextCompat.checkSelfPermission(context, Manifest.permission.CAMERA)
    == PackageManager.PERMISSION_DENIED)

然后,您可以使用这个来向用户发送请求:

ActivityCompat.requestPermissions(activity, new String[] {Manifest.permission.CAMERA}, requestCode);

在Marshmallow中,它将出现在对话框中


非常感谢... :-) 现在它正在请求权限。 - Toyas
不客气。如果我的回答对您有帮助,请标记为解决方案 ;) - Serch
7
Manifest.permission.CAMERA 中,我看到了 CAMERA 的红色文本。 - Moeez
8
使用android.Manifest.permission.CAMERA。 - Shadab K
在2023年,这已经过时了。直接在您的AppCompatActivity对象上调用requestPermissions方法,不要使用静态方法。请参见其他答案。 - zomega
requestPermissions也已经被弃用了。请使用registerForActivityResult。 - Abdullah

65

您可以尝试以下代码在 marshmallow 上请求相机权限。首先检查用户是否授予权限。如果用户没有授予权限,则请求相机权限:

private static final int MY_CAMERA_REQUEST_CODE = 100;

if (checkSelfPermission(Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {
    requestPermissions(new String[]{Manifest.permission.CAMERA}, MY_CAMERA_REQUEST_CODE);
}

在请求权限后,会显示一个对话框来询问是否允许,包含“允许”和“拒绝”选项。在点击操作后,我们可以通过以下方法获取请求的结果:

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    if (requestCode == MY_CAMERA_REQUEST_CODE) {
        if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
            Toast.makeText(this, "camera permission granted", Toast.LENGTH_LONG).show();
        } else {
            Toast.makeText(this, "camera permission denied", Toast.LENGTH_LONG).show();
        }
    }
}

7
这对我很有效,参考来源在这里
int MY_PERMISSIONS_REQUEST_CAMERA=0;
// Here, this is the current activity
if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED)
{
     if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.CAMERA))
     {

     }
     else
     {
          ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.CAMERA}, MY_PERMISSIONS_REQUEST_CAMERA );
          // MY_PERMISSIONS_REQUEST_READ_CONTACTS is an
          // app-defined int constant. The callback method gets the
          // result of the request.
      }
}

3

其中最简单的获取权限的方法是使用deterex库。像下面这样在gradle中实现以下库。

    implementation 'com.karumi:dexter:6.2.2'

在添加库后,可以使用以下方式进行权限控制:
        Dexter.withContext(this)
            .withPermissions(
                    Manifest.permission.CAMERA
            ).withListener(new MultiplePermissionsListener() {
        @Override public void onPermissionsChecked(MultiplePermissionsReport report) {/* ... */}
        @Override public void onPermissionRationaleShouldBeShown(List<PermissionRequest> permissions, PermissionToken token) {/*
        ... */}
    }).check();

不要忘记在你的清单文件中添加用户权限

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

3
check using this
if (ContextCompat.checkSelfPermission(this, android.Manifest.permission.CAMERA)
            == PackageManager.PERMISSION_DENIED)

并且

2
我尝试添加以下代码:
private static final int MY_CAMERA_REQUEST_CODE = 100;

@RequiresApi(api = Build.VERSION_CODES.M)

if (checkSelfPermission(Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {
        requestPermissions(new String[]{Manifest.permission.CAMERA}, MY_CAMERA_REQUEST_CODE);
    }

关于onCreate函数和以下代码:

@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    if (requestCode == MY_CAMERA_REQUEST_CODE) {
        if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
            Toast.makeText(this, "camera permission granted", Toast.LENGTH_LONG).show();
        } else {
            Toast.makeText(this, "camera permission denied", Toast.LENGTH_LONG).show();
        }
    }
}

这对我很有效 :)

1

点击此处获取完整源代码并了解更多。

在获得权限之前,您可以检查API版本。

  if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M)
  {
      if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) {

      } 
      else
      {
         ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, 401);
      }
  }
  else
  {
    // if version is below m then write code here,          
  }

获取权限对话框的结果。
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    if (requestCode == 401) {
        if (grantResults.length == 0 || grantResults == null) {

        } else if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
            openGallery();
        } else if (grantResults[0] == PackageManager.PERMISSION_DENIED) {
        }
    } else if (requestCode == 402) {
        if (grantResults.length == 0 || grantResults == null) {

        } else if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {

        } else if (grantResults[0] == PackageManager.PERMISSION_DENIED) {
        }
    }
} 

1

请求权限

在以下代码中,我们将请求相机权限:

在Java中

EasyPermissions是一个包装库,用于简化针对Android M或更高版本的基本系统权限逻辑。

安装 通过将以下依赖项添加到您的build.gradle文件来安装EasyPermissions:

dependencies {

    // For developers using AndroidX in their applications
    implementation 'pub.devrel:easypermissions:3.0.0'

    // For developers using the Android Support Library
    implementation 'pub.devrel:easypermissions:2.0.1'

}


private void askAboutCamera(){

        EasyPermissions.requestPermissions(
                this,
                "A partir deste ponto a permissão de câmera é necessária.",
                CAMERA_REQUEST_CODE,
                Manifest.permission.CAMERA );
}

0
         private const val CAMERA_PERMISSION_REQUEST_CODE = 2323

         if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) 
           {
             if (checkSelfPermission(Manifest.permission.CAMERA) != 
             PackageManager.PERMISSION_GRANTED) 
               {
            requestPermissions(arrayOf(Manifest.permission.CAMERA), 
            CAMERA_PERMISSION_REQUEST_CODE)
               }
           }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接