点击悬浮按钮拨打电话时遇Intent参数类型不匹配错误求助
解决ContextCompat.startActivity类型不匹配的问题
嘿,我一眼就揪出问题啦——你调用ContextCompat.startActivity()的时候参数传错顺序啦!这个方法的第一个参数必须是Context,第二个才是你创建的Intent,而你只传了Intent,难怪会报类型不匹配的错误。
接下来咱们一步步把代码改对:
第一步:修正makePhoneCall方法的参数与调用逻辑
你的makePhoneCall方法里没有传入Context,而Activity本身就是Context的子类,所以可以这么调整:
首先,给makePhoneCall函数添加上Context参数,同时修正ContextCompat.startActivity的传参顺序:
fun makePhoneCall(context: Context, number: String) : Boolean { try { val intent = Intent(Intent.ACTION_CALL) intent.data = Uri.parse("tel:$number") // 正确传参:先传Context实例,再传Intent,第三个参数传null即可 ContextCompat.startActivity(context, intent, null) return true } catch (e: Exception) { e.printStackTrace() return false } }
然后在Fab的点击事件里调用时,传入当前Activity的Context(也就是this):
fab.setOnClickListener { view -> Snackbar.make(view, "Secretariaat wordt gebeld", Snackbar.LENGTH_LONG) .setAction("Action", null).show() // 传入当前Activity实例作为Context makePhoneCall(this, "0123456") }
第二步:别忘了处理电话权限
另外,使用Intent.ACTION_CALL必须申请CALL_PHONE权限,不然会抛出权限异常,得做两件事:
- 在
AndroidManifest.xml里添加权限声明:
<uses-permission android:name="android.permission.CALL_PHONE" />
- Android 6.0(API 23)及以上版本需要动态申请权限,所以在调用拨打电话逻辑前先检查权限:
fab.setOnClickListener { view -> Snackbar.make(view, "Secretariaat wordt gebeld", Snackbar.LENGTH_LONG) .setAction("Action", null).show() // 检查是否已获取电话权限 if (ContextCompat.checkSelfPermission(this, Manifest.permission.CALL_PHONE) == PackageManager.PERMISSION_GRANTED) { makePhoneCall(this, "0123456") } else { // 申请权限 ActivityCompat.requestPermissions(this, arrayOf(Manifest.permission.CALL_PHONE), 1001) } }
最后重写权限申请结果的回调方法:
override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<out String>, grantResults: IntArray) { super.onRequestPermissionsResult(requestCode, permissions, grantResults) if (requestCode == 1001) { if (grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED) { makePhoneCall(this, "0123456") } else { Toast.makeText(this, "需要开启电话权限才能拨打电话", Toast.LENGTH_SHORT).show() } } }
这样修改后,不仅能解决类型不匹配的错误,还能避免权限相关的异常,你的悬浮按钮拨打电话功能就能正常工作啦~
内容的提问来源于stack exchange,提问作者KingMong007
相关产品推荐
相关产品推荐

