当前位置:首页 > 行业动态 > 正文

安卓发送短信 结果

安卓发送短信失败可能因信号差、短信中心号错、权限限制或系统故障,需检查网络状态,核对运营商服务号,确认APP权限开启,重启设备或恢复默认短信应用,若仍异常,可联系运营商排查基站或SIM卡

短信发送流程及结果处理

发送短信的核心逻辑

安卓系统通过 SmsManager 类实现短信发送,支持单条或分批发送长短信,发送过程为异步操作,需通过 PendingIntent 监听结果

安卓发送短信 结果  第1张

关键步骤:

  • 调用 SmsManager.getDefault() 获取实例。
  • 使用 sendTextMessage() 方法发送短信。
  • 通过 BroadcastReceiverPendingIntent 接收发送结果。

发送结果的状态码

状态码 描述 解决方案
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 权限或未动态申请权限。
  • 解决方案
    1. AndroidManifest.xml 中添加权限:
      <uses-permission android:name="android.permission.SEND_SMS" />
    2. 针对 Android 6.0+,动态申请权限:
      if (ContextCompat.checkSelfPermission(this, Manifest.permission.SEND_SMS) != PackageManager.PERMISSION_GRANTED) {
          ActivityCompat.requestPermissions(this, arrayOf(Manifest.permission.SEND_SMS), REQUEST_CODE)
      }
    3. 检查用户是否拒绝权限并引导至设置页面重新授权
0