Kotlin开发USSD拨号App时FirstFragment类型不匹配报错如何解决
问题原因
两个类型不匹配错误都出在权限校验和申请的代码行,核心原因是ActivityCompat.checkSelfPermission()要求传入Context参数、ActivityCompat.requestPermissions()要求传入Activity参数,但你传入的this是当前FirstFragment实例,Fragment本身既不是Context也不是Activity,因此触发类型错误。
修复方案
仅需要修改onViewCreated中权限相关代码的传参即可:
ActivityCompat.checkSelfPermission的第一个参数从this替换为requireContext(),获取Fragment当前依附的有效Context实例ActivityCompat.requestPermissions的第一个参数从this替换为requireActivity(),获取Fragment当前依附的有效Activity实例
修改后的对应代码段如下:
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) button.setOnClickListener { Toast.makeText( context, "You Clicked the Button", Toast.LENGTH_SHORT ).show() // 仅修改以下两行的第一个参数即可 if(ActivityCompat.checkSelfPermission(requireContext(), android.Manifest.permission.CALL_PHONE) !=PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions( requireActivity(), arrayOf(android.Manifest.permission.CALL_PHONE), REQUEST_PHONE_CALL ) } else { startCall() } } // END button }
额外优化建议
- 权限回调中增加授权结果判断,避免用户拒绝权限后调用拨号逻辑崩溃:
override fun onRequestPermissionsResult( requestCode: Int, permissions: Array<out String>, grantResults: IntArray ) { super.onRequestPermissionsResult(requestCode, permissions, grantResults) if(requestCode == REQUEST_PHONE_CALL && grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED) { startCall() } else { Toast.makeText(requireContext(), "需要授予拨号权限才能使用该功能", Toast.LENGTH_SHORT).show() } }
- 确保你的
AndroidManifest.xml中已经声明拨号权限:
<uses-permission android:name="android.permission.CALL_PHONE" />
内容的提问来源于stack exchange,提问作者mohdadawe
相关产品推荐
相关产品推荐

