运行时的权限
在运行时申请权限
假如我们要申请什么危险权限,第一步需要在AndroidManifest中申请。
<?xml version="1.0" encoding="utf-8"?>
<manifest ...
<uses-permission android:name="android.permission.CALL_PHONE"/>
...
这里申请了可以拨打电话的权限。
如果这里就开始执行拨打电话的功能,系统会出错,并且提醒你权限被禁止了。
尝试修复。
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val binding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root)
binding.makeCall.setOnClickListener {
if (ContextCompat.checkSelfPermission(this,android.Manifest.permission.CALL_PHONE)!=PackageManager.PERMISSION_GRANTED) //如没有申请权限
{
ActivityCompat.requestPermissions(this, arrayOf(android.Manifest.permission.CALL_PHONE),1)
}else //如有
call()
}
}
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()
}
}
}
ContextCompat.checkSelfPermission接收两个参数,第一个是Context,第二个是申请权限的具体名字。返回值与PackageManager.PERMISSION_GRANTED比较。
未授权则调用ActivityCompat.requestPermissions方法,三个参数,第一个同样是Context,第二个是一个String数组,将申请的权限名放里面,第三个是请求码,只要是唯一值就可以。
此时调用完requestPermissions后,系统会出现一个对话框申请权限,用户可以拒绝或者接收,无论结果如何都会存入到grantResults里。