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

