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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 01:05:12