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

Kotlin Android Studio实现SMS收发功能的示例代码请求

Kotlin Android SMS 收发示例代码

1. 权限配置

首先在AndroidManifest.xml中添加必要权限:

<!-- 发送短信权限 -->
<uses-permission android:name="android.permission.SEND_SMS" />
<!-- 接收短信权限 -->
<uses-permission android:name="android.permission.RECEIVE_SMS" />
<!-- 读取短信权限(可选,如需读取历史短信) -->
<uses-permission android:name="android.permission.READ_SMS" />

Android 6.0(API 23)及以上需动态申请权限,在Activity中添加权限申请逻辑:

private val SMS_PERMISSIONS = arrayOf(
    Manifest.permission.SEND_SMS,
    Manifest.permission.RECEIVE_SMS,
    Manifest.permission.READ_SMS
)
private val PERMISSION_REQUEST_CODE = 100

// 检查并申请权限
private fun checkSmsPermissions() {
    if (ContextCompat.checkSelfPermission(this, Manifest.permission.SEND_SMS) != PackageManager.PERMISSION_GRANTED ||
        ContextCompat.checkSelfPermission(this, Manifest.permission.RECEIVE_SMS) != PackageManager.PERMISSION_GRANTED) {
        ActivityCompat.requestPermissions(this, SMS_PERMISSIONS, PERMISSION_REQUEST_CODE)
    }
}

// 权限申请回调
override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<out String>, grantResults: IntArray) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults)
    if (requestCode == PERMISSION_REQUEST_CODE) {
        if (grantResults.all { it == PackageManager.PERMISSION_GRANTED }) {
            // 权限已授予,可执行短信操作
        } else {
            Toast.makeText(this, "需要短信权限才能使用功能", Toast.LENGTH_SHORT).show()
        }
    }
}

2. 发送预设短信

使用SmsManager发送短信,支持发送/送达状态回调:

private fun sendPresetSms(targetPhoneNumber: String, presetMessage: String) {
    val smsManager = SmsManager.getDefault()
    // 拆分长短信(内容超过单条限制时自动拆分)
    val messageParts = smsManager.divideMessage(presetMessage)
    
    // 发送状态回调意图
    val sentIntent = PendingIntent.getBroadcast(
        this,
        0,
        Intent("SMS_SENT"),
        PendingIntent.FLAG_IMMUTABLE or PendingIntent.FLAG_UPDATE_CURRENT
    )
    // 送达状态回调意图
    val deliveredIntent = PendingIntent.getBroadcast(
        this,
        0,
        Intent("SMS_DELIVERED"),
        PendingIntent.FLAG_IMMUTABLE or PendingIntent.FLAG_UPDATE_CURRENT
    )

    // 注册发送状态接收器
    registerReceiver(object : BroadcastReceiver() {
        override fun onReceive(context: Context?, intent: Intent?) {
            when (resultCode) {
                Activity.RESULT_OK -> Toast.makeText(context, "短信发送成功", Toast.LENGTH_SHORT).show()
                SmsManager.RESULT_ERROR_GENERIC_FAILURE -> Toast.makeText(context, "发送失败:通用错误", Toast.LENGTH_SHORT).show()
                SmsManager.RESULT_ERROR_NO_SERVICE -> Toast.makeText(context, "发送失败:无服务", Toast.LENGTH_SHORT).show()
                SmsManager.RESULT_ERROR_NULL_PDU -> Toast.makeText(context, "发送失败:PDU为空", Toast.LENGTH_SHORT).show()
                SmsManager.RESULT_ERROR_RADIO_OFF -> Toast.makeText(context, "发送失败:无线电关闭", Toast.LENGTH_SHORT).show()
            }
            context?.unregisterReceiver(this)
        }
    }, IntentFilter("SMS_SENT"))

    // 注册送达状态接收器
    registerReceiver(object : BroadcastReceiver() {
        override fun onReceive(context: Context?, intent: Intent?) {
            when (resultCode) {
                Activity.RESULT_OK -> Toast.makeText(context, "短信已送达", Toast.LENGTH_SHORT).show()
                Activity.RESULT_CANCELED -> Toast.makeText(context, "短信未送达", Toast.LENGTH_SHORT).show()
            }
            context?.unregisterReceiver(this)
        }
    }, IntentFilter("SMS_DELIVERED"))

    // 发送短信
    if (messageParts.size == 1) {
        smsManager.sendTextMessage(targetPhoneNumber, null, presetMessage, sentIntent, deliveredIntent)
    } else {
        smsManager.sendMultipartTextMessage(targetPhoneNumber, null, messageParts, listOf(sentIntent), listOf(deliveredIntent))
    }
}

3. 接收并解析特定号码的短信

Android 8.0(API 26)后静态注册SMS_RECEIVED广播会被限制,推荐动态注册接收器:

// 定义短信接收器
private val smsReceiver = object : BroadcastReceiver() {
    override fun onReceive(context: Context?, intent: Intent?) {
        if (intent?.action == "android.provider.Telephony.SMS_RECEIVED") {
            val bundle = intent.extras ?: return
            val pdus = bundle.get("pdus") as Array<*>
            val targetPhoneNumber = "13800138000" // 替换为你需要监听的特定号码

            for (pdu in pdus) {
                val smsMessage = SmsMessage.createFromPdu(pdu as ByteArray)
                val sender = smsMessage.originatingAddress
                val messageBody = smsMessage.messageBody

                // 过滤特定号码的短信
                if (sender == targetPhoneNumber) {
                    parseSmsContent(messageBody)
                    Toast.makeText(context, "收到目标号码短信:$messageBody", Toast.LENGTH_SHORT).show()
                }
            }
        }
    }
}

// 解析短信内容的业务逻辑
private fun parseSmsContent(content: String) {
    // 示例:按分隔符拆分内容
    val parts = content.split("|")
    if (parts.size >= 2) {
        val dataType = parts[0]
        val dataContent = parts[1]
        // 根据解析结果执行对应操作
    }
}

// 在Activity生命周期中注册/注销接收器
override fun onStart() {
    super.onStart()
    val intentFilter = IntentFilter("android.provider.Telephony.SMS_RECEIVED")
    intentFilter.priority = 999 // 设置高优先级,确保优先接收短信
    registerReceiver(smsReceiver, intentFilter)
}

override fun onStop() {
    super.onStop()
    unregisterReceiver(smsReceiver)
}

4. 发送短信后等待回复的逻辑

通过记录发送信息,匹配目标号码的回复:

// 记录最近发送的目标号码(示例用全局变量,实际可存SharedPreferences或数据库)
private var lastSentTargetNumber: String? = null

// 修改发送方法,记录目标号码
private fun sendPresetSms(targetPhoneNumber: String, presetMessage: String) {
    lastSentTargetNumber = targetPhoneNumber
    // 原发送代码...
}

// 修改接收器逻辑,匹配回复
override fun onReceive(context: Context?, intent: Intent?) {
    if (intent?.action == "android.provider.Telephony.SMS_RECEIVED") {
        val bundle = intent.extras ?: return
        val pdus = bundle.get("pdus") as Array<*>

        for (pdu in pdus) {
            val smsMessage = SmsMessage.createFromPdu(pdu as ByteArray)
            val sender = smsMessage.originatingAddress
            val messageBody = smsMessage.messageBody

            // 判断是否为上次发送目标的回复
            if (sender == lastSentTargetNumber) {
                handleReply(messageBody)
                lastSentTargetNumber = null // 处理完成后清空记录
            }
        }
    }
}

// 处理回复内容
private fun handleReply(replyContent: String) {
    Toast.makeText(this, "收到回复:$replyContent", Toast.LENGTH_SHORT).show()
    // 根据回复内容执行业务操作
}

内容的提问来源于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 13:07:38