1.权限
- 普通权限:不会直接威胁到用户安全和隐私的权限
- 危险权限:那些可能会触及用户隐私或者对设备安全性造成影响的权限。
到Android 10 系统为止所以的危险权限
2、在程序运行时申请权限
- 普通权限申请:系统会自动帮我们进行授权,不需要用户手动操作。
- 危险权限申请:在Android6.0及以上系统在使用时必须进行运行时权限处理。
危险权限申请步骤
(1)判断用户是否给我们授权了。
checkSelfPermission()方法,第一个参数是Context,第二个参数是具体的权限名,然后我们使用方法的返回值和PackageManager.PERMISSION_GRANTED作比较。相等就说明用户已经授权,我们直接执行拨打电话的操作进行。不等就说明用户没有授权,则需要调用ActivityCompat.requestPermissions()方法向用户申请权限。requestPermissions()方法有三个参数,第一个参数要求是Activity的实例,第二个参数是一个String数组,把要申请的权限名放入数组中,第三个参数是唯一的请求码。
if(ContextCompat.checkSelfPermission(this,android.Manifest.permission.CALL_PHONE)!=PackageManager.PERMISSION_GRANTED){ ActivityCompat.requestPermissions(this, arrayOf(android.Manifest.permission.CALL_PHONE),1) } else{ call() }
(2)用户已经授权,我们直接执行拨打电话的操作。
private fun call(){ try { val intent=Intent(Intent.ACTION_CALL) intent.data= Uri.parse("tel:10086") startActivity(intent) }catch (e:SecurityException){ e.printStackTrace() } }
(3)用户没有授权,调用ActivityCompat.requestPermissions()方法之后,系统会弹出一个权限申请的对话框,用户可以选择接受或者拒绝申请,最后回调到onRequestPermissionsResult()方法·。
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() } } } }