You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Kotlin报错Type mismatch:需Context却传String,如何解决SIM卡检测问题?

解决getSystemService类型不匹配错误

错误根源

你使用的ContextCompat.getSystemService()需要两个参数:Context实例 + 服务类型常量(如Context.TELEPHONY_SERVICE)。你的代码只传入了服务类型字符串,缺少Context参数,导致类型不匹配报错。

修复方案

  1. 在Composable中通过LocalContext.current获取当前上下文
  2. 调用getSystemService时按顺序传入Context和服务类型
  3. 补充权限校验(读取SIM信息必须申请READ_PHONE_STATE权限)

修正后的完整代码片段

@Composable
fun SimCardDetector() {
    val context = LocalContext.current
    // 权限请求发射器
    val permissionLauncher = rememberLauncherForActivityResult(
        contract = ActivityResultContracts.RequestPermission()
    ) { isGranted ->
        if (isGranted) {
            fetchSimInfo(context)
        } else {
            Toast.makeText(context, "拒绝权限将无法读取SIM信息", Toast.LENGTH_SHORT).show()
        }
    }

    Button(onClick = {
        when {
            ContextCompat.checkSelfPermission(context, Manifest.permission.READ_PHONE_STATE) == PackageManager.PERMISSION_GRANTED -> {
                fetchSimInfo(context)
            }
            Build.VERSION.SDK_INT >= Build.VERSION_CODES.M -> {
                permissionLauncher.launch(Manifest.permission.READ_PHONE_STATE)
            }
        }
    }) {
        Text(text = "获取SIM数据")
    }
}

private fun fetchSimInfo(context: Context) {
    val telephonyManager = ContextCompat.getSystemService(context, TelephonyManager::class.java)
    telephonyManager?.let { tm ->
        val simCount = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            tm.phoneCount
        } else {
            // 低版本兼容:默认单卡,双卡机型需额外处理
            1
        }

        val simOptions = mutableListOf<String>()
        for (index in 0 until simCount) {
            val operatorName = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
                tm.getSimOperatorName(index) ?: "未知运营商"
            } else {
                tm.simOperatorName ?: "未知运营商"
            }
            simOptions.add("SIM ${index + 1}: $operatorName")
        }

        Toast.makeText(context, simOptions.joinToString("\n"), Toast.LENGTH_LONG).show()
    }
}

额外提示

  • Android 8.0(API 26)及以上支持phoneCount获取双卡数量,低版本需自行兼容双卡判断逻辑
  • 监听SIM状态变化:注册TelephonyManager.ACTION_SIM_STATE_CHANGED广播接收器,可捕获SIM插拔、激活/停用等状态变更
  • Android 13+读取SIM号码需额外申请READ_PHONE_NUMBERS权限,读取运营商信息仍使用READ_PHONE_STATE

内容的提问来源于stack exchange,提问作者Mohammed

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 01:37:11