Android 三种拨号方式(kotlin)

2 篇文章 0 订阅
2 篇文章 0 订阅

前置代码


// 获取界面上输入的电话号码
val phoneNumber = findViewById<EditText>(R.id.text_phone_number).text.toString()
val uri = Uri.parse("tel:$phoneNumber")

直接拨打电话


Log.i(localClassName, "###直接拨打电话")
val intent = Intent(Intent.ACTION_CALL, uri)
// 判断权限,针对不同的版本,有的动要态再获取权限
if (ContextCompat.checkSelfPermission(this, Manifest.permission.CALL_PHONE) == PackageManager.PERMISSION_GRANTED) {
    intent.action = Intent.ACTION_CALL
    intent.data = uri
    startActivity(intent)
} else {
    ActivityCompat.requestPermissions(this, arrayOf(Manifest.permission.CALL_PHONE), 1)
}

跳转页面拨打电话


Log.i(localClassName, "###跳转拨打电话")
val intent = Intent(Intent.ACTION_DIAL, uri)
startActivity(intent)

反射方式拨打电话


Log.i(localClassName, "###反射方式拨打电话")
if (Build.VERSION.SDK_INT > Build.VERSION_CODES.P) {
    Toast.makeText(this, "该方法不支持Android9(sdk28)以上版本", Toast.LENGTH_LONG).show()
    return
}
try {
    // 首先拿到TelephonyManager
    val telManager = getSystemService(TELEPHONY_SERVICE) as TelephonyManager
    // 通过反射取得方法,这里的用法和java有所不同,要多注意
    val method: Method = telManager.javaClass.getDeclaredMethod("getITelephony")
    method.isAccessible = true
    val obj = method.invoke(telManager)
    val mt = obj.javaClass.getMethod("call", String().javaClass, String().javaClass)
    mt.isAccessible = true
    // 修改方法后开始拨打电话
    mt.invoke(obj, packageName + "", phoneNumber)
    Log.i(localClassName, "###反射方式拨打电话成功")
} catch (e: Exception) {
    Log.i(localClassName, "###反射方式拨打电话失败")
    e.printStackTrace();
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

暴躁竹子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值