当前位置:首页 > 云服务器 > 正文

Android短信发送文档的编写方法有哪些,短信发送实现代码如何写

使用 SmsManager 发送短信

Android 提供两种主要方式发送短信:直接使用 SmsManager 发送,或通过 Intent 调用系统短信应用。

获取 SmsManager 实例

SmsManager smsManager = SmsManager.getDefault();

发送文本短信

使用 sendTextMessage 方法:

Android短信发送文档的编写方法有哪些,短信发送实现代码如何写 第1张

  • 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 权限,但需要用户手动发送:

Android短信发送文档的编写方法有哪些,短信发送实现代码如何写 第2张

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 协议)。

Android短信发送文档的编写方法有哪些,短信发送实现代码如何写 第3张

0