用户权限申请之拨打电话(一)
ps:代码来源于郭大神的第一行代码。第三版,仅做学习使用
class MainActivity : AppCompatActivity() {
var makecall: Button? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
makecall = findViewById(R.id.makecall)
makecall?.setOnClickListener {
//6.0之前可以这样使用危险权限来拨打电话,
//6.0之后这种危险权限就被禁止了
//java.lang.SecurityException: Permission Denial: starting Intent
// { act=android.intent.action.CALL dat=tel:xxxxx cmp=com.android.server.telecom/.components.UserCallActivity }
// from ProcessRecord{706f4ee 24864:com.cjh.runtimepermissiontest/u0a332} (pid=24864, uid=10332)
// with revoked permission android.permission.CALL_PHONE
/*原来的代码 val intent = Intent(Intent.ACTION_CALL)
intent.data = Uri.parse("tel:10086")
startActivity(intent)*/
/**
* 先判断用户是不是已经给过我们授权了
* 参数1: 上下文
* 参数2:具体的权限名
* 使用checkSelfPermission的返回值跟PackageManager.PERMISSION_GRANTED作比较,相等就已经授权,不相等。。。。。
*/
if (ContextCompat.checkSelfPermission(this, Manifest.permission.CALL_PHONE) != PackageManager.PERMISSION_GRANTED){
//向用户申请权限授权, 实例 String数组 请求码
ActivityCompat.requestPermissions(this, arrayOf(Manifest.permission.CALL_PHONE), 1)
} else{
call()
}
}
}
override fun onRequestPermissionsResult(
requestCode: Int,
permissions: Array<out String>,
grantResults: IntArray
) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults)
//用户是否同意权限申请都会回调到这里,授权的结果则会封装在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()
}
}
}