Android短信发送文档的编写方法有哪些,短信发送实现代码如何写
- 云服务器
- 2026-07-25
- 7
使用 SmsManager 发送短信
Android 提供两种主要方式发送短信:直接使用 SmsManager 发送,或通过 Intent 调用系统短信应用。
获取 SmsManager 实例
SmsManager smsManager = SmsManager.getDefault();
发送文本短信
使用 sendTextMessage 方法:

- destinationAddress:收件人号码
- scAddress:短信中心号码,通常为 null 使用默认
- text
- sentIntent:发送状态 PendingIntent(可选)
- deliveryIntent:送达状态 PendingIntent(可选)
发送长短信(超过 160 字符)
系统会自动拆分为多条,但需手动调用 divideMessage 方法:
ArrayList<String> parts = smsManager.divideMessage(longText); ArrayList<PendingIntent> sentIntents = new ArrayList<>(); // 为每条拆分短信创建 PendingIntent smsManager.sendMultipartTextMessage(destinationAddress, scAddress, parts, sentIntents, null);
发送数据短信(二进制数据)
用于发送特殊格式内容,如 OTA 消息:
smsManager.sendDataMessage(destinationAddress, scAddress, port, data, sentIntent, deliveryIntent);
- port:目标端口号(0-65535)
- data:字节数组数据
权限声明
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, new String[]{Manifest.permission.SEND_SMS}, REQUEST_CODE_SMS); }
使用 Intent 调用系统短信应用
无需 SEND_SMS 权限,但需要用户手动发送:

Intent intent = new Intent(Intent.ACTION_SENDTO); intent.setData(Uri.parse("smsto:" + phoneNumber)); intent.putExtra("sms_body", "Hello"); startActivity(intent);
发送状态监听
通过 PendingIntent 监听发送结果:
PendingIntent sentPI = PendingIntent.getBroadcast(this, 0, new Intent("SMS_SENT"), PendingIntent.FLAG_IMMUTABLE); // 注册广播接收器,处理发送结果
注意事项
| 要点 | 说明 |
|---|---|
| 短信长度 | 单条 160 字符(英文),70 字符(中文),超长自动拆分 |
| 权限 | 动态请求,拒绝后需提示用户 |
| 模拟器 | 部分模拟器无法真正发送短信,需使用真机 |
| 运营商限制 | 频繁发送可能被拦截 |
| 隐私政策 | 收集用户号码需合规 |
相关问题与解答
问题1:如何监听短信是否发送成功?
解答:通过 sendTextMessage 方法的 sentIntent 参数传入一个 PendingIntent,并注册对应的广播接收器,在广播的 onReceive 中检查 getResultCode():
- Activity.RESULT_OK:发送成功
- SmsManager.RESULT_ERROR_GENERIC_FAILURE:通用失败
- SmsManager.RESULT_ERROR_NO_SERVICE:无服务
- SmsManager.RESULT_ERROR_NULL_PDU:PDU 为空
- SmsManager.RESULT_ERROR_RADIO_OFF:无线关闭
示例代码:
// 发送方 Intent sentIntent = new Intent("SMS_SENT"); PendingIntent sentPI = PendingIntent.getBroadcast(this, 0, sentIntent, PendingIntent.FLAG_IMMUTABLE); smsManager.sendTextMessage(phone, null, message, sentPI, null); // 广播接收器 BroadcastReceiver receiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { switch (getResultCode()) { case Activity.RESULT_OK: // 发送成功 break; case SmsManager.RESULT_ERROR_GENERIC_FAILURE: // 发送失败 break; } } }; registerReceiver(receiver, new IntentFilter("SMS_SENT"));
问题2:为什么发送长短信时,部分手机收到多条短信,而部分手机合并为一条?
解答:这是由手机硬件和运营商实现的差异造成的,Android 系统在发送长短信时,会将内容拆分为多条 160 字符(或 70 中文字符)的短信,每条短信带有段序号和总段数信息,接收端手机根据这些信息重新组装。
- 部分手机支持自动合并(如大多数智能手机)
- 部分手机(尤其是老款功能机)可能无法合并,显示为多条独立短信
开发者无法控制接收端的合并行为,但可以确保发送时正确使用 sendMultipartTextMessage 方法,让系统自动添加合并信息,如果希望强制合并,可以考虑使用彩信(MMS)或数据消息(如通过 RCS 协议)。
