Kotlin实现按钮拨打指定预设号码无响应问题求助
解决Android Kotlin中点击按钮拨打*#0*#无响应的问题
问题根源
*#0*#是安卓系统专属的硬件测试USSD代码,普通的ACTION_DIAL Intent仅负责打开拨号界面并填充号码,无法直接触发这类特殊代码的执行逻辑——这类代码需要直接发起呼叫请求才能激活系统的测试界面。此外,你当前的权限配置和Intent使用也存在适配问题。
解决方案
方案1:使用ACTION_CALL并处理动态权限(推荐)
ACTION_CALL会直接发起呼叫请求,但Android 6.0(API 23)及以上需要动态申请CALL_PHONE权限,步骤如下:
- 保留Manifest中的权限声明:
<uses-permission android:name="android.permission.CALL_PHONE"/>
- 修改Kotlin代码,添加权限检查与请求逻辑:
val button3 = findViewById<Button>(R.id.button3) val testNumber = "*#0*#" button3.setOnClickListener { // 检查是否已授权CALL_PHONE权限 if (ContextCompat.checkSelfPermission(this, Manifest.permission.CALL_PHONE) == PackageManager.PERMISSION_GRANTED) { val intent = Intent(Intent.ACTION_CALL, Uri.parse("tel:$testNumber")) startActivity(intent) } else { // 动态申请权限 ActivityCompat.requestPermissions(this, arrayOf(Manifest.permission.CALL_PHONE), 100) } } // 处理权限请求结果 override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<out String>, grantResults: IntArray) { super.onRequestPermissionsResult(requestCode, permissions, grantResults) if (requestCode == 100 && grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED) { // 权限通过后执行呼叫 val intent = Intent(Intent.ACTION_CALL, Uri.parse("tel:$testNumber")) startActivity(intent) } }
方案2:无权限的替代方案(部分系统支持)
如果不想申请CALL_PHONE权限,可以尝试使用ACTION_VIEW Intent,部分安卓系统支持通过该方式触发特殊USSD代码:
val button3 = findViewById<Button>(R.id.button3) button3.setOnClickListener { val intent = Intent(Intent.ACTION_VIEW, Uri.parse("tel:*#0*#")) startActivity(intent) }
额外排查点
- 确认按钮ID
R.id.button3与布局文件中的ID完全一致,避免控件查找错误 - 测试普通号码(如
10086)是否能通过ACTION_DIAL正常打开拨号界面,排除按钮点击事件本身的问题 - 检查父布局是否存在
onTouch事件拦截,导致按钮点击未触发
内容的提问来源于stack exchange,提问作者Jonah Cameron
相关产品推荐
相关产品推荐

