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
相关产品推荐
相关产品推荐

