如何编写和发送安卓超长短信?
一、
在android平台上,发送短信时如果内容超过70个中文字符(实际为67个字符),则需要进行特殊处理,这是因为一条普通短信的最大容量是70个中文字符,超过这个长度就需要使用分批发送的方法。
二、发送方式
1. 通过sendtextmessage()方法逐条发送
优点:实现简单。
缺点:用户会分条收到短信,体验不佳。
代码示例:
if (message.length() > 70) { arraylistmsgs = smsmanager.dividemessage(message); for (string msg : msgs) { smsmanager.sendtextmessage(phonenumber, null, msg, sentpi, deliverpi); } } else { smsmanager.sendtextmessage(phonenumber, null, message, sentpi, deliverpi); }
2. 使用sendmultiparttextmessage()方法发送
优点:用户收到的是连在一起的一整条短信。
缺点:实现相对复杂。
代码示例:
if (message.length() > 70) { arraylistmsgs = smsmanager.dividemessage(message); arraylist sentintents = new arraylist<>(); for (int i = 0; i < msgs.size(); i ) { sentintents.add(sentpi); } smsmanager.sendmultiparttextmessage(phonenumber, null, msgs, sentintents, null); } else { smsmanager.sendtextmessage(phonenumber, null, message, sentpi, deliverpi); }
三、超长短信协议头详解
超长短信的发送涉及到复杂的协议头信息,以下是两种常见的协议头格式:
1. 6位协议头格式
格式:05 00 03 xx mm nn
byte 1: 05,表示剩余协议头的长度。
byte 2: 00,标识位长度为1。
byte 3: 03,剩下短信标识的长度。
byte 4: xx,这批短信的唯一标志。
byte 5: mm,这批短信的数量。
byte 6: nn,当前短信是这批短信中的第几条。
示例:05 00 03 39 02 01
2. 7位协议头格式
格式:06 08 04 xx xx mm nn
byte 1: 06,表示剩余协议头的长度。
byte 2: 08,标识位长度为2。
byte 3: 04,剩下短信标识的长度。
byte 4-5: xx xx,这批短信的唯一标志。
byte 6: mm,这批短信的数量。
byte 7: nn,当前短信是这批短信中的第几条。
示例:06 08 04 00 39 02 01
四、接收与存储机制
1. 接收机制
长短信会分割成多条发送过来,每一条头部会带上总共有多少条和这是第几条的信息,手机收到其中一条短信时,如果辨别出是长短信,则先把短信存储在raw表内(sqlite路径:/data/data/com.android.providers.telephony/databases/mms***s.db),当收完全部短信时,就把raw表的相关内容删除,传播到其他程序处理,主要在***sdispatcher.java的proces***essagepart函数中进行处理。
2. 存储机制
为了确保发送成功,还需要检查电话号码是否有效(这里仅检查非空,实际应用中可能需要更复杂的正则表达式验证)以及短信内容长度是否超过70个字符。
短信内容部分,有六个字节分别定义短信唯一标识以及该短信是第几条,所以长短信发送时每条实际为67个汉字。
1. 归纳
发送方式:主要有逐条发送和使用sendmultiparttextmessage()方法两种方式。
协议头:涉及复杂的协议头信息,包括6位和7位两种格式。
接收与存储:手机接收到长短信后会先存储在raw表中,收完全部后再进行处理。
2. 建议
用户体验:优先使用sendmultiparttextmessage()方法,以提供更好的用户体验。
错误处理:在实际开发中,应添加必要的错误处理逻辑,以应对网络问题或发送失败的情况。
性能优化:对于大量短信发送的场景,可以考虑批量发送和异步处理,以提高性能。
六、相关问题与解答
q1: android中超长短信的分割是如何实现的?
a1: android中超长短信的分割是通过******anager类的dividemessage()方法来实现的,该方***根据短信的最大长度(70个中文字符或67个字符)将长短信分割成多个部分,并返回一个包含这些部分的arraylist,开发者可以遍历这个arraylist,逐条发送短信。
q2: 如果需要发送的短信内容非常长,超过了普通短信的长度限制,应该如何处理?
a2: 如果需要发送的短信内容超过了普通短信的长度限制(70个中文字符或67个字符),应该使用******anager类的sendmultiparttextmessage()方法来发送,该方法允许将长短信分割成多个部分,并以多条短信的形式发送出去,但用户收到的仍然是一整条短信,在使用该方法时,需要先将长短信分割成多个部分,并为每个部分创建一个pendingintent对象,然后将这些部分和pendingintent对象传递给sendmultiparttextmessage()方法。
到此,以上就是小编对于“安卓超长短信”的问题就介绍到这了,希望介绍的几点解答对大家有用,有任何问题和不懂的,欢迎各位朋友在评论区讨论,给我留言。