Kotlin报错Type mismatch:需Context却传String,如何解决SIM卡检测问题?
解决getSystemService类型不匹配错误
错误根源
你使用的ContextCompat.getSystemService()需要两个参数:Context实例 + 服务类型常量(如Context.TELEPHONY_SERVICE)。你的代码只传入了服务类型字符串,缺少Context参数,导致类型不匹配报错。
修复方案
- 在Composable中通过
LocalContext.current获取当前上下文 - 调用
getSystemService时按顺序传入Context和服务类型 - 补充权限校验(读取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
相关产品推荐
相关产品推荐

