第2世界
发布于 2023-04-18 / 8 阅读 / 0 评论 / 0 点赞

android申请相机权限

android开发中用到相机权限,该权限需要动态申请,属于运行时权限。

运行时权限也称为危险权限,此类权限授予应用对受限数据的额外访问权限,或允许应用执行对系统和其他应用具有更严重影响的受限操作。因此,您需要先在应用中请求运行时权限,然后才能访问受限数据或执行受限操作。请勿假定这些权限之前已经授予过,务必仔细检查,并根据需要在每次访问之前请求这些权限。

声明权限

AndroidManifest.xml 中添加:

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

如果允许没有该硬件的情况下安装应用,则添加:

<uses-feature android:name="android.hardware.camera" android:required="false" />

请求权限

if (ContextCompat.checkSelfPermission(
    this, android.Manifest.permission.CAMERA
 ) != PackageManager.PERMISSION_GRANTED
) {
  Log.d("TAG", "请求权限: start")
  ActivityCompat.requestPermissions(this, arrayOf(android.Manifest.permission.CAMERA), 1)
} else {
  Log.d("TAG", "拥有权限: start")
}

请求结果处理

override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<out String>, grantResults: IntArray) {
  super.onRequestPermissionsResult(requestCode, permissions, grantResults)
  when (requestCode) {
    1 -> {
      if (grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
        Log.d("TAG", "CameraContainer: do")
     } else {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && shouldShowRequestPermissionRationale(
            Manifest.permission.CAMERA
         )
       ) {
          ActivityCompat.requestPermissions(this, arrayOf(android.Manifest.permission.CAMERA), 1)
       } else {
          Toast.makeText(this, "You denied the permission", Toast.LENGTH_SHORT).show()
          Log.d("TAG", "权限被拒绝")
          val intent = Intent().apply {
            addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
            action = "android.settings.APPLICATION_DETAILS_SETTINGS"
            data = Uri.fromParts("package", packageName, null)
         }
          startActivity(intent)
       }
​
     }
   }
 }
}


评论