如何在 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 中正确拨打电话意图?的主要内容,如果未能解决你的问题,请参考以下文章