在Android中从应用程序启动拨号程序会出错

时间:2019-01-08 08:58:27

标签: android kotlin

我正在尝试从我的应用中拨打用户,从而在android中启动拨号器

我已提供清单权限

<uses-permission android:name="android.permission.CALL_PHONE"/>

我还提供了运行时权限

代码:

private fun startPhoneDial(phoneNo: String) {
        val callIntent = Intent(Intent.ACTION_CALL)
        //callIntent.data = Uri.parse(phoneNo)
        if (Build.VERSION.SDK_INT > Build.VERSION_CODES.LOLLIPOP_MR1) {
            callIntent.setPackage("com.android.phone")
        }else{
            callIntent.setPackage("com.android.server.telecom")
        }
        callIntent.data = Uri.parse("tel:$phoneNo")
        startActivity(callIntent)
    }

错误堆栈跟踪

Exception: Method threw 'android.content.ActivityNotFoundException' exception.

Message: No Activity found to handle Intent { act=android.intent.action.CALL dat=tel:xxxxxxxxxx pkg=com.android.phone }

5 个答案:

答案 0 :(得分:2)

尝试这样。

val callIntent = Intent(Intent.ACTION_DIAL)
callIntent.setData(Uri.parse("tel:" + phone_number));

答案 1 :(得分:0)

使用此功能,确保您具有CALL_PHONE的运行时权限

fun callANumber(context: Context, phoneNo: String) {
     if (TextUtils.isEmpty(phoneNo)) {
        return
    }

    val callIntent = Intent(Intent.ACTION_CALL)
    callIntent.data = Uri.parse("tel:$phoneNo")

    try {
        context.startActivity(callIntent)
    } catch (e: ActivityNotFoundException) {
        Toast.makeText(context,"No Activity found which can handle intent",Toast.LENGTH_LONG).show()
    }

}

答案 2 :(得分:0)

我建议您删除该硬编码包,而只需使用通用意图打开拨号程序,因为这将调用可用意图,而不是给定意图。

或者您可以在处理活动未找到异常之后将其放在下面的代码中。

private fun startPhoneDial(phoneNo: String) {
        val callIntent = Intent(Intent.ACTION_CALL)
        //callIntent.data = Uri.parse(phoneNo)
        if (Build.VERSION.SDK_INT > Build.VERSION_CODES.LOLLIPOP_MR1) {
            callIntent.setPackage("com.android.phone")
        }else{
            callIntent.setPackage("com.android.server.telecom")
        }
        callIntent.data = Uri.parse("tel:$phoneNo")
        try{
        startActivity(callIntent)        
        }
        catch(exp : ActivityNotFoundException){
         val intent = new Intent(Intent.ACTION_DIAL);
         intent.setData(Uri.parse("tel:${phoneNo}"));
         startActivity(intent); 

        }
    }

答案 3 :(得分:0)

我们可以直接致电ACTION_DIAL。

            val phone = "+919898989898"
            val intent = Intent(Intent.ACTION_DIAL, Uri.fromParts("tel", phone, null))
            startActivity(intent)

参考:-https://stackoverflow.com/a/18973484/2553615

答案 4 :(得分:0)

因为这是相反的方式...在小于棒棒糖的版本中,它是:

com.android.phone

从棒棒糖开始的版本为:

com.android.server.telecom

因此,您应该像这样交换大于号:

private fun startPhoneDial(phoneNo: String) {
    val callIntent = Intent(Intent.ACTION_CALL)
    //callIntent.data = Uri.parse(phoneNo)
    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP_MR1) {
        callIntent.setPackage("com.android.phone")
    }else{
        callIntent.setPackage("com.android.server.telecom")
    }
    callIntent.data = Uri.parse("tel:$phoneNo")
    startActivity(callIntent)
}