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

