Android平台如何获取短信发送方ID/号码?(SMS Retriever API场景)
SMS Retriever API获取发送方ID并实现特定发送方OTP过滤方案
1. 从广播接收器中直接获取发送方ID
SMS Retriever API的广播回调中已内置发送方标识字段,只需在onReceive方法里通过SmsRetriever.EXTRA_SENDER提取即可:
class SmsReceiver : BroadcastReceiver() { override fun onReceive(context: Context?, intent: Intent?) { intent?.takeIf { it.action == SmsRetriever.SMS_RETRIEVED_ACTION }?.let { val status = it.extras?.get(SmsRetriever.EXTRA_STATUS) as Status when (status.statusCode) { CommonStatusCodes.SUCCESS -> { val smsMessage = it.extras?.getString(SmsRetriever.EXTRA_SMS_MESSAGE) // 核心:获取发送方ID/号码 val senderId = it.extras?.getString(SmsRetriever.EXTRA_SENDER) // 过滤特定发送方,仅符合条件时触发OTP弹窗 senderId?.takeIf { it == "你的目标发送方ID/号码" }?.let { val otp = extractOtp(smsMessage ?: "") // 执行自动填充弹窗逻辑 showOtpPopup(otp) } } CommonStatusCodes.TIMEOUT -> { // 超时处理,比如提示用户手动输入OTP } } } } private fun extractOtp(message: String): String { // 示例:提取短信中的6位数字OTP return Regex("\\d{6}").find(message)?.value ?: "" } private fun showOtpPopup(otp: String) { // 实现OTP弹窗填充逻辑,比如将OTP填入输入框 } }
2. 发送方ID的格式注意事项
- 发送方ID可能是短代码(如6位数字)、完整手机号或运营商分配的自定义标识,具体取决于短信发送渠道
- 必须确保短信符合SMS Retriever的规范:内容包含你的应用签名哈希,且长度不超过140字符,否则无法触发回调
3. 调试与适配技巧
- 先打印
senderId的实际值,确认目标发送方的真实标识后再设置过滤条件,避免匹配错误 - 如果部分场景下
EXTRA_SENDER为空,可以退而求其次,从短信内容前缀提取发送方(比如【XX平台】),用正则匹配判断:
private fun isTargetSender(message: String): Boolean { val allowedSenders = listOf("【XX平台】", "1069XXXXXX") return allowedSenders.any { message.startsWith(it) } }
内容的提问来源于stack exchange,提问作者sanil
相关产品推荐
相关产品推荐

