如何在 Kotlin 中正确拨打电话意图?

Posted

技术标签:

【中文标题】如何在 Kotlin 中正确拨打电话意图?【英文标题】:How to make call the phone intent properly in Kotlin? 【发布时间】:2018-11-05 07:27:28 【问题描述】:

我尝试在 Kotlin 上调用电话意图,如下所示:

 imgPhone.setOnClick 
            val intent = Intent(Intent.ACTION_CALL, Uri.parse("tel:" + "1122334455"))
            startActivity(intent)
        

点击手机图片时,视觉上没有任何反应。结果调试器向你展示了这个:

java.lang.SecurityException: Permission Denial: 开始 Intent act=android.intent.action.CALL dat=tel:xxxxxxxxxx cmp=com.android.server.telecom/.components.UserCallActivity

我尝试了几种解决方案:

    将这一行放在AndroidManifest.xml中:

    在调用意图所在的Activity上添加android:exported="true" 调用:

    < activity android:name=".activities.ProfileActivity" android:exported="true"/>
    

    明确请求许可:

    override fun onCreate() 
    super.onCreate()
    /*
    more codes here
    */
    setupPermissions()
     
    
    fun setupPermissions() 
    val permission = ContextCompat.checkSelfPermission(this, Manifest.permission.CALL_PHONE)
    
        if (permission != PackageManager.PERMISSION_GRANTED) 
        Log.i("Error", "Permission to call denied")
        
    
    

到目前为止,这些解决方法都不起作用(在 Android 6 上)。同样的 SecurityException 仍然发生。那么正确的解决方案是什么呢?

【问题讨论】:

询问并检查运行时权限***.com/a/49201404/9130109如果符合您的需要投票给答案 【参考方案1】:

在 Marshmallow 中,您必须在运行时请求权限,仅在清单中是不够的。在您写的选项(3)上,您几乎做到了。在那里你只是检查权限,而不是请求它。

官方文档是这样的:https://developer.android.com/training/permissions/requesting

代码将与此类似:

fun checkPermission() 
   if (ContextCompat.checkSelfPermission(this,
           Manifest.permission.CALL_PHONE)
           != PackageManager.PERMISSION_GRANTED) 

       // Permission is not granted
       // Should we show an explanation?
       if (ActivityCompat.shouldShowRequestPermissionRationale(this,
            Manifest.permission.CALL_PHONE)) 
           // Show an explanation to the user *asynchronously* -- don't block
           // this thread waiting for the user's response! After the user
           // sees the explanation, try again to request the permission.
        else 
           // No explanation needed, we can request the permission.
           ActivityCompat.requestPermissions(this,
                   arrayOf(Manifest.permission.CALL_PHONE),
                   42)
       
    else 
       // Permission has already been granted
       callPhone()
   


override fun onRequestPermissionsResult(requestCode: Int,
        permissions: Array<String>, grantResults: IntArray) 
    if (requestCode == 42) 
            // If request is cancelled, the result arrays are empty.
            if ((grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED)) 
                // permission was granted, yay!
                callPhone()
             else 
                // permission denied, boo! Disable the
                // functionality
            
            return
        


fun callPhone()
        val intent = Intent(Intent.ACTION_CALL, Uri.parse("tel:" + "1122334455"))
        startActivity(intent)

别忘了你在清单上也需要它。 而且您可以从您的活动中删除导出的内容,这是没有意义的。

希望对你有帮助!

【讨论】:

啊,我明白了。谢谢你:)

以上是关于如何在 Kotlin 中正确拨打电话意图?的主要内容,如果未能解决你的问题,请参考以下文章

如何在未经许可的情况下在Android中使用意图拨打电话?

使用 Kotlin Android Studio 拨打电话

拨打电话号码列表并返回活动

拨打电话号码

在android中拨打电话号码时缺少括号

在应用程序处于信息亭模式时拨打电话