第8章 ContentProvider
8.2 运行时权限
Android6.0时引入的,为了更好地保护用户的安全和隐私。
8.2.1 Android 权限机制详解
Android中常用的权限分成了两类:普通权限和危险权限。(还有特殊权限,使用比较少)
危险权限必须由用户手动授权才可以,因为危险权限可能会触及用户隐私或者对设备安全性造成影响的权限。
8.2.2 在程序运行时申请权限
下面就是比较完整的 申请一个权限的代码:(连续同时申请几个权限,代码存在差异)。
第一步判断用户是否已经授权了 :ContextCompat.checkSelfPermission()方法,该方法有两个参数,context,第二个参数是具体的权限名;如:ContextCompat.checkSelfPermission(this,android.Manifest.permission.CALL_PHONE);将这个方法的返回值和PackageManager.PERMISSION_GRANTED 比较:相等则表示用户已经授权了。
第二步若没有授权则进行权限申请 :调用ActivityCompat.requestPermissions()方法向用户申请权限。该方法有是三个参数:第一个参数:要求是Activity的实例;第二个参数是一个string数组;第三个参数是一个请求码,要保证该值是唯一的;如:ActivityCompat.requestPermissions(this, arrayOf(android.Manifest.permission.CALL_PHONE),1)
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
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:15181802534")
startActivity(intent)
}catch (e:SecurityException){
e.printStackTrace()
}
}