上一篇
安卓发送短信 结果
- 行业动态
- 2025-04-22
- 6
安卓发送短信失败可能因信号差、短信中心号错、权限限制或系统故障,需检查网络状态,核对运营商服务号,确认APP权限开启,重启设备或恢复默认短信应用,若仍异常,可联系运营商排查基站或SIM卡
短信发送流程及结果处理
发送短信的核心逻辑
安卓系统通过 SmsManager
类实现短信发送,支持单条或分批发送长短信,发送过程为异步操作,需通过 PendingIntent
监听结果。
关键步骤:
- 调用
SmsManager.getDefault()
获取实例。 - 使用
sendTextMessage()
方法发送短信。 - 通过
BroadcastReceiver
或PendingIntent
接收发送结果。
发送结果的状态码
状态码 | 描述 | 解决方案 |
---|---|---|
Activity.RESULT_OK |
短信发送成功 | 无需处理 |
RESULT_ERROR_GENERIC |
通用错误(如网络问题) | 检查信号、重试或提示用户 |
RESULT_ERROR_NO_SERVICE |
无信号或服务不可用 | 提示用户检查网络或移动服务 |
RESULT_ERROR_NULL_PDU |
PDU 数据为空 | 检查短信内容是否合法 |
RESULT_ERROR_RADIO_OFF |
飞行模式或射频关闭 | 提示用户关闭飞行模式或开启射频 |
常见问题与解决方案
权限问题
- 现象:应用崩溃或无法发送短信。
- 原因:未声明或未动态申请
SEND_SMS
权限。 - 解决方案:
- 在
AndroidManifest.xml
中添加:<uses-permission android:name="android.permission.SEND_SMS" />
- 运行时动态申请权限(针对 Android 6.0+):
if (ContextCompat.checkSelfPermission(this, Manifest.permission.SEND_SMS) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(this, arrayOf(Manifest.permission.SEND_SMS), REQUEST_CODE) }
- 在
第三方应用拦截
- 现象:短信发送成功但未收到(如被安全软件拦截)。
- 解决方案:
- 检查第三方应用(如安全软件、短信管家)的拦截规则。
- 引导用户将应用加入白名单。
代码示例(Kotlin)
// 1. 申请权限(Android 6.0+) private val REQUEST_SMS = 1 if (ContextCompat.checkSelfPermission(this, Manifest.permission.SEND_SMS) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(this, arrayOf(Manifest.permission.SEND_SMS), REQUEST_SMS) } else { sendSms("1234567890", "Test message") } // 2. 发送短信并监听结果 private fun sendSms(phoneNumber: String, message: String) { val smsManager = SmsManager.getDefault() val messageSplit = smsManager.divideMessage(message) // 长短信分包 val sentIntent = getBroadcastIntent("SMS_SENT_ACTION") val deliveredIntent = getBroadcastIntent("SMS_DELIVERED_ACTION") for (part in messageSplit) { smsManager.sendTextMessage(phoneNumber, null, part, sentIntent, deliveredIntent) } } // 3. 创建 PendingIntent 用于结果回调 private fun getBroadcastIntent(action: String): PendingIntent { val intent = Intent(action) return PendingIntent.getBroadcast(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT) } // 4. 注册广播接收器 override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) val filter = IntentFilter().apply { addAction("SMS_SENT_ACTION") addAction("SMS_DELIVERED_ACTION") } registerReceiver(smsResultReceiver, filter) } // 5. 处理发送结果 private val smsResultReceiver = object : BroadcastReceiver() { override fun onReceive(context: Context, intent: Intent) { val resultCode = getResultCode() val format = intent.getStringExtra("format") // 短信格式(text/plain) when (resultCode) { Activity.RESULT_OK -> showToast("短信发送成功") RESULT_ERROR_GENERIC -> showToast("发送失败,请重试") // 其他错误码处理... } } }
相关问题与解答
问题1:如何判断短信是否送达对方?
解答:
- 安卓系统仅保证短信离开设备(
SMS_SENT_ACTION
),无法直接获知对方是否接收。 - 若需确认送达,需依赖运营商的“送达回执”功能,但需对方手机支持且开启此功能。
- 可通过
SMS_DELIVERED_ACTION
监听本地送达状态,但仅限同一设备应用间通信。
问题2:发送短信时出现 SecurityException
怎么办?
解答:
- 原因:未声明
SEND_SMS
权限或未动态申请权限。 - 解决方案:
- 在
AndroidManifest.xml
中添加权限:<uses-permission android:name="android.permission.SEND_SMS" />
- 针对 Android 6.0+,动态申请权限:
if (ContextCompat.checkSelfPermission(this, Manifest.permission.SEND_SMS) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(this, arrayOf(Manifest.permission.SEND_SMS), REQUEST_CODE) }
- 检查用户是否拒绝权限并引导至设置页面重新授权
- 在