如何编写和发送安卓超长短信?
一、
在Android平台上,发送短信时如果内容超过70个中文字符(实际为67个字符),则需要进行特殊处理,这是因为一条普通短信的最大容量是70个中文字符,超过这个长度就需要使用分批发送的方法。
二、发送方式
1. 通过sendTextMessage()方法逐条发送
优点:实现简单。
缺点:用户会分条收到短信,体验不佳。
代码示例:
if (message.length() > 70) { ArrayList<String> msgs = 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) { ArrayList<String> msgs = smsManager.divideMessage(message); ArrayList<PendingIntent> 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()方法。
到此,以上就是小编对于“安卓超长短信”的问题就介绍到这了,希望介绍的几点解答对大家有用,有任何问题和不懂的,欢迎各位朋友在评论区讨论,给我留言。