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

Kotlin中基于Activity上下文创建SmsManager实例报错咨询

解决SmsManager实例创建时的空指针转换错误

错误Cannot cast null object to non-null object是因为context.getSystemService(SmsManager::class.java)返回了null,但你用了非空的强制类型转换as SmsManager,而Kotlin的非空类型不允许接收null值。

以下是具体解决方案:

  • 安全处理空返回值
    用安全转换操作符as?替代强制转换,再通过Elvis操作符处理null场景,避免崩溃同时给出明确错误信息。修改后的代码示例:

    private fun getSmsManagerForSubscriptionId(context: Context, subsId: Int): SmsManager {
        val smsManager = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            context.getSystemService(SmsManager::class.java) as? SmsManager
                ?: throw IllegalStateException("无法获取SmsManager服务")
        } else {
            TODO("VERSION.SDK_INT < M")
        }
        val smsManagerInstanceForSubsId = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
            smsManager.createForSubscriptionId(subsId)
        } else {
            TODO("VERSION.SDK_INT < S")
        }
        return smsManagerInstanceForSubsId
    }
    
  • 检查并申请必要权限
    确保应用已获取短信相关权限,先在AndroidManifest.xml中声明:

    <uses-permission android:name="android.permission.SEND_SMS" />
    <uses-permission android:name="android.permission.READ_SMS" />
    

    针对Android 6.0(API 23)及以上版本,还需动态申请这些权限,只有用户授权后才能正常获取SmsManager服务。

  • 适配无短信服务的设备
    无SIM卡的平板等设备可能没有短信服务,此时getSystemService会返回null。可以将函数返回类型改为可空,提前返回null并在调用处处理:

    private fun getSmsManagerForSubscriptionId(context: Context, subsId: Int): SmsManager? {
        val smsManager = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            context.getSystemService(SmsManager::class.java) as? SmsManager
        } else {
            TODO("VERSION.SDK_INT < M")
        } ?: return null
    
        return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
            smsManager.createForSubscriptionId(subsId)
        } else {
            TODO("VERSION.SDK_INT < S")
        }
    }
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 09:12:39