Android的危险权限是需要动态申请的,以下以申请打电话权限为例演示申请过程:
在配置文件中申请权限
申请权限过程(Activity)
这里使用了一个按键来触发申请权限的操作,将打电话的动作封装到了call()函数中。
- 首先进行权限的判断,是否给了权限,给了就直接执行打电话的动作;没给就通过requestPermissions()函数申请权限。
- 重载onRequestPermissionsResult()函数来反应申请后用户给予权限的情况,给了就执行打电话动作,没给就给个toast提示一下。
class MainActivity : AppCompatActivity() {
lateinit var binding:ActivityMainBinding
override fun onCreate(savedInstanceState: Bundle?) {
binding=ActivityMainBinding.inflate(layoutInflater)
super.onCreate(savedInstanceState)
setContentView(binding.root)
//触发权限申请事件
binding.btn.setOnClickListener{
if (ContextCompat.checkSelfPermission(this, android.Manifest.permission.CALL_PHONE)==PackageManager.PERMISSION_GRANTED){
call()
}else{
ActivityCompat.requestPermissions(this, arrayOf(android.Manifest.permission.CALL_PHONE),1)
}
}
}
//重载该函数对权限申请后的授予情况做出反应
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){
call()
}else{
Toast.makeText(this, "you denied the permission !", Toast.LENGTH_SHORT).show()
}
}
}
}
//该函数封装了打电话的动作
private fun call(){
try {
val intent=Intent(Intent.ACTION_CALL)
intent.data=Uri.parse("tel:10086")
startActivity(intent)
}catch (e:SecurityException){
e.printStackTrace()
}
}
}