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)
}
}
}
}
}