Kotlin Android短信收发问题:API弃用与权限异常崩溃求助
解决方案
1. 解决SmsManager.getDefault()弃用警告
Android API 33及以上版本中,SmsManager.getDefault()已被弃用,正确的实例获取方式是通过系统服务:
val smsManager = getSystemService(SmsManager::class.java)
或使用applicationContext(降低内存泄漏风险):
val smsManager = applicationContext.getSystemService(SmsManager::class.java)
你之前的崩溃并非因该获取方式导致,而是权限申请流程存在错误。
2. 修复权限申请逻辑导致的SecurityException
问题根源
- 你误用
PackageManager.PERMISSION_GRANTED作为requestPermissions的请求码(第二个参数),请求码需自定义唯一常量,而非权限授予状态值。 - 未等待用户授权通过就直接调用
sendSms,导致权限未生效时触发安全异常。
修正步骤
步骤1:定义权限请求码常量
在LoginActivity中添加:
private val REQUEST_SMS_PERMISSIONS = 101
步骤2:修正权限申请流程
确保仅在权限未授予时发起申请,且等待授权结果后再执行短信发送:
// 定义所需权限数组 val requiredPermissions = arrayOf( android.Manifest.permission.RECEIVE_SMS, android.Manifest.permission.SEND_SMS, android.Manifest.permission.READ_SMS ) // 检查是否有未授予的权限 if (requiredPermissions.any { checkSelfPermission(it) != PackageManager.PERMISSION_GRANTED }) { requestPermissions(requiredPermissions, REQUEST_SMS_PERMISSIONS) } else { // 权限已全部授予,直接发送短信 sendSms("50004000151398", "OK") }
步骤3:处理权限授权结果
重写onRequestPermissionsResult方法,判断用户是否授予所有权限:
override fun onRequestPermissionsResult( requestCode: Int, permissions: Array<out String>, grantResults: IntArray ) { super.onRequestPermissionsResult(requestCode, permissions, grantResults) if (requestCode == REQUEST_SMS_PERMISSIONS) { // 检查所有权限是否都被授予 val allGranted = grantResults.all { it == PackageManager.PERMISSION_GRANTED } if (allGranted) { sendSms("50004000151398", "OK") } else { // 提示用户需要权限才能继续操作 Toast.makeText(this, "需要授予短信权限才能发送验证码", Toast.LENGTH_SHORT).show() } } }
步骤4:调整sendSms函数位置
将sendSms函数移出点击事件监听,作为Activity的成员方法:
private fun sendSms(phoneNumber: String, message: String) { val smsManager = applicationContext.getSystemService(SmsManager::class.java) smsManager.sendTextMessage(phoneNumber, null, message, null, null) }
3. 验证Manifest配置
确保权限声明位于<application>标签之外,配置格式正确:
<uses-feature android:name="android.hardware.telephony" android:required="true" /> <uses-permission android:name="android.permission.READ_SMS" /> <uses-permission android:name="android.permission.RECEIVE_SMS" /> <uses-permission android:name="android.permission.SEND_SMS" /> <application <!-- 你的应用配置 --> > <!-- Activity等组件声明 --> </application>
内容的提问来源于stack exchange,提问作者Amir Elahi
相关产品推荐
相关产品推荐

