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

Android SmsManager显示短信发送成功但收件方未收到问题求助

问题:长短信发送日志显示成功但收件方未收到,短短信正常

使用Android SmsManager发送短消息时可成功送达,但符合字符限制的较长应急消息(含定位URL)却无法被收件方接收,日志显示发送成功,但收件方始终未收到。已验证手机号有效,且应用已获取SEND_SMS权限,无权限问题。

代码片段

private void sendEmergencySMS() {
    String message = "SOS! Emergency at my location! https://maps.google.com/maps?q=" +
            currentLocation.latitude + "," + currentLocation.longitude;
    
    SmsManager smsManager = SmsManager.getDefault();
    ArrayList<String> parts = smsManager.divideMessage(message);

    String[] emergencyNumbers = {number1, number2};

    for (String number : emergencyNumbers) {
        if (number != null) {
            smsManager.sendMultipartTextMessage(number, null, parts, null, null);
            Log.e("wew", "Sending to: " + number + " in parts: " + parts.size());
        } else {
            Log.e("wew", "Number is null, skipping...");
        }
    }
}

排查与解决思路

  • 检查短信拆分逻辑:SmsManager.divideMessage默认按GSM-7编码拆分,若消息包含特殊字符(如URL中的符号),可能导致拆分后的片段出现编码异常,无法被收件方正常拼接。可以打印parts列表的内容,确认每一片段是否完整;也可以尝试使用SmsManager.getDefault().encodeMultipartText手动指定UTF-16编码后再拆分。
  • 添加发送/送达状态监听:当前代码未监听短信的发送状态和送达状态,日志显示的“发送成功”只是应用层的调用成功,不代表运营商已成功投递。通过PendingIntent注册广播监听,能获取真实的发送结果:
    // 创建发送状态监听的PendingIntent
    Intent sentIntent = new Intent("SMS_SENT_ACTION");
    PendingIntent sentPI = PendingIntent.getBroadcast(this, 0, sentIntent, PendingIntent.FLAG_IMMUTABLE);
    // 创建送达状态监听的PendingIntent
    Intent deliverIntent = new Intent("SMS_DELIVERED_ACTION");
    PendingIntent deliverPI = PendingIntent.getBroadcast(this, 0, deliverIntent, PendingIntent.FLAG_IMMUTABLE);
    
    // 发送时传入监听PendingIntent,注意分片短信需要对应数量的PendingIntent
    smsManager.sendMultipartTextMessage(number, null, parts, 
        Collections.nCopies(parts.size(), sentPI), 
        Collections.nCopies(parts.size(), deliverPI));
    
    然后注册BroadcastReceiver接收回调,根据返回的结果码判断是否有分片发送失败。
  • 验证运营商拦截规则:部分运营商会拦截包含URL的长短信(判定为营销/风险短信),或者对长短信的分片数量、单条长度有额外限制。可以测试发送不含URL的纯文本长消息,或更换不同运营商的收件号码,排查是否是运营商拦截导致。
  • 检查设备短信拦截设置:部分设备的系统短信应用、第三方安全软件会拦截长短信或批量发送的短信。尝试用系统自带短信应用手动发送相同的长消息,确认是否能正常接收。
  • 规范手机号格式:短短信可能兼容不带国家码的手机号,但长短信发送时部分运营商要求必须带国家码(如+86)。尝试给收件号码添加国家码后再发送。

内容的提问来源于stack exchange,提问作者Chichi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 19:27:31