android发送与接收超长短信
android接收发送短信,支持的最大字符数是70个,实际是67个字符,如果发送的短信超过了该数目,那就需要用到sendMultipartTextMessage()方法
public void sendMultipartTextMessage (
String destinationAddress,
String scAddress,
ArrayList<String> parts,
ArrayList<PendingIntent> sentIntents,
ArrayList<PendingIntent> deliveryIntents)
使用divideMessage方法分割短信再发送
private void sendMessage(String destAddress, String content, Uri uri) {
SmsManager smsManager = SmsManager.getDefault();
List<String> divideContents = smsManager.divideMessage(content);
Log.e("txrjsms", "divide into " + divideContents.size() + " parts.");
for (String text : divideContents) {
Log.i("txrjsms", text+"(length:"+text.length()+")");
// smsManager.sendTextMessage(destAddress, null, text, getSentIntent(uri), null);
}
}
查看日志
07-21 09:51:59.641: E/txrjsms(22832): divide into 2 parts.
07-21 09:51:59.641: I/txrjsms(22832): 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ 01234(length:153)
07-21 09:51:59.641: I/txrjsms(22832): 56789ABCDEFGHIJKLMNOPQRSTUVWXYZ 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ(length:68)
分割短信之SmsManager.divideMessage(String text)
ArrayList<String> android.telephony.SmsManager.divideMessage(String text)
android-sdk-windows\sources\android-16\android\telephony\SmsManager.java
public ArrayList<String> divideMessage(String text) {
return SmsMessage.fragmentText(text);
}
分割短信之SmsMessage.fragmentText(String text)
ArrayList<String> android.telephony.SmsMessage.fragmentText(String text)
android-sdk-windows\sources\android-16\android\telephony\SmsMessage.java
导入手机类型常量PHONE_TYPE_CDMA
import static android.telephony.TelephonyManager.PHONE_TYPE_CDMA;
在TelephonyManager中定义手机类型常量
/** No phone radio. */
public static final int PHONE_TYPE_NONE = Phone.PHONE_TYPE_NONE;
/** Phone radio is GSM. */
public static final int PHONE_TYPE_GSM = Phone.PHONE_TYPE_GSM;
/** Phone radio is CDMA. */
public static final int PHONE_TYPE_CDMA = Phone.PHONE_TYPE_CDMA;
/** Phone is via SIP. */
public static final int PHONE_TYPE_SIP = Phone.PHONE_TYPE_SIP;
实现SmsManager.fragmentText(String text)
public static ArrayList<String> android.telephony.SmsManager.fragmentText(String text) {
int activePhone = TelephonyManager.getDefault().getCurrentPhoneType();
TextEncodingDetails ted = (PHONE_TYPE_CDMA == activePhone) ?
com.android.internal.telephony.cdma.SmsMessage.calculateLength(text, false) :
com.android.internal.telephony.gsm.SmsMessage.calculateLength(text, false);
// TODO(cleanup): The code here could be rolled into the logic
// below cleanly if these MAX_* constants were defined more
// flexibly...
int limit;
if (ted.codeUnitSize == ENCODING_7BIT) {
int udhLength;
if (ted.languageTable != 0 && ted.languageShiftTable != 0) {
udhLength = GsmAlphabet.UDH_SEPTET_COST_TWO_SHIFT_TABLES;
} else if (ted.languageTable != 0 || ted.languageShiftTable != 0) {
udhLength = GsmAlphabet.UDH_SEPTET_COST_ONE_SHIFT_TABLE;
} else {
udhLength = 0;
}
if (ted.msgCount > 1) {
udhLength += GsmAlphabet.UDH_SEPTET_COST_CONCATENATED_MESSAGE;
}
if (udhLength != 0) {
udhLength += GsmAlphabet.UDH_SEPTET_COST_LENGTH;
}
limit = MAX_USER_DATA_SEPTETS - udhLength;
} else {
if (ted.msgCount > 1) {
limit = MAX_USER_DATA_BYTES_WITH_HEADER;
} else {
limit = MAX_USER_DATA_BYTES;
}
}
int pos = 0; // Index in code units.
int textLen = text.length();
ArrayList<String> result = new ArrayList<String>(ted.msgCount);
while (pos < textLen) {
int nextPos = 0; // Counts code units.
if (ted.codeUnitSize == ENCODING_7BIT) {
if (activePhone == PHONE_TYPE_CDMA && ted.msgCount == 1) {
// For a singleton CDMA message, the encoding must be ASCII...
nextPos = pos + Math.min(limit, textLen - pos);
} else {
// For multi-segment messages, CDMA 7bit equals GSM 7bit encoding (EMS mode).
nextPos = GsmAlphabet.findGsmSeptetLimitIndex(text, pos, limit,
ted.languageTable, ted.languageShiftTable);
}
} else { // Assume unicode.
nextPos = pos + Math.min(limit / 2, textLen - pos);
}
if ((nextPos <= pos) || (nextPos > textLen)) {
Log.e(LOG_TAG, "fragmentText failed (" + pos + " >= " + nextPos + " or " +
nextPos + " >= " + textLen + ")");
break;
}
result.add(text.substring(pos, nextPos));
pos = nextPos;
}
return result;
}
发送信息的三种方法(在android.telephony.SmsManager中定义)
SmsManager.getDefault().sendDataMessage(destinationAddress, scAddress, destinationPort, data, sentIntent, deliveryIntent);
SmsManager.getDefault().sendTextMessage(destinationAddress, scAddress, text, sentIntent, deliveryIntent);
SmsManager.getDefault().sendMultipartTextMessage(destinationAddress, scAddress, parts, sentIntents, deliveryIntents);
发送信息方法一
void sendTextMessage(
String destinationAddress,
String scAddress,
String text,
PendingIntent sentIntent,
PendingIntent deliveryIntent)
Send a text based SMS. 发送SMS文本
- Parameters:
- destinationAddress the address to send the message to 目的地址
- scAddress is the service center address or null to use the current default SMSC 服务中心地址(OR默认的SMSC)
- text the body of the message to send 信息内容
- sentIntent if not NULL this
PendingIntentis broadcast when the message is sucessfully sent, or failed. 信息发送成功或失败触发 - deliveryIntent if not NULL this
PendingIntentis broadcast when the message is delivered to the recipient. The raw pdu of the status report is in the extended data ("pdu"). 信息抵达收信人触发 - Throws:
- IllegalArgumentException - if destinationAddress or text are empty 目的地址或短信内容为空抛出异常
发送信息方法二
void sendMultipartTextMessage(
String destinationAddress,
String scAddress,
ArrayList<String> parts,
ArrayList<PendingIntent> sentIntents,
ArrayList<PendingIntent> deliveryIntents)Send a multi-part text based SMS. The callee should have already divided the message into correctly sized parts by calling
divideMessage. 发送SMS多部分文本。要求先调用divideMessage()方法将信息分割成多个部分。- Parameters:
- destinationAddress the address to send the message to
- scAddress is the service center address or null to use the current default SMSC
- parts an
ArrayListof strings that, in order, comprise the original message - sentIntents if not null, an
ArrayListofPendingIntents (one for each message part) that is broadcast when the corresponding message part has been sent. - deliveryIntents if not null, an
ArrayListofPendingIntents (one for each message part) that is broadcast when the corresponding message part has been delivered to the recipient. The raw pdu of the status report is in the extended data ("pdu"). - Throws:
- IllegalArgumentException - if destinationAddress or data are empty
使用sendMultipartTextMessage()方法发送长信息给10010,收不到回复
07-21 11:19:36.834: E/txrjsms(23832): divide into 2 parts.
07-21 11:19:36.834: I/txrjsms(23832): 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ 01234(length:153)
07-21 11:19:36.834: I/txrjsms(23832): 56789ABCDEFGHIJKLMNOPQRSTUVWXYZ 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ(length:68)
07-21 11:19:36.834: E/txrjsms(23832): send long message. // MessageListActivity’s log
07-21 11:19:41.048: E/txrjsms(23832): send (1/2) msg success. // SendSmsReceiver’s log
07-21 11:19:45.663: E/txrjsms(23832): send (2/2) msg success. // SendSmsReceiver’s log07-21 11:28:59.003: E/txrjsms(24429): divide into 2 parts.
07-21 11:28:59.003: I/txrjsms(24429): 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890
07-21 11:28:59.003: I/txrjsms(24429): 1234567890 1234567890 1234567890 1234567890(length:153)
07-21 11:28:59.003: I/txrjsms(24429): 1234567890 1234567890 1234567890 1234567890 1234567890 1234567890(length:66)
07-21 11:28:59.003: E/txrjsms(24429): send long message.
07-21 11:29:03.016: E/txrjsms(24429): send (1/2) msg success.
07-21 11:29:06.980: E/txrjsms(24429): send (2/2) msg success.使用sendTextMessage()方法发送的信息给10010,收到回复。
由于信息比较长,被分割成了两条,因此收到两条回复。
分割更长的信息。中文怎么分割成67个字符呢
07-21 11:38:56.295: E/txrjsms(24778): divide into 6 parts.
07-21 11:38:56.295: I/txrjsms(24778): 984路
07-21 11:38:56.295: I/txrjsms(24778): 去程:九华山庄-大柳树环岛南-小汤山马坊-北京太阳城-种禽公司-平坊-平西府-东三旗-东三旗南站-天通苑太平庄-天通西苑北-(length:67)
07-21 11:38:56.375: I/txrjsms(24778): 天通西苑南-东小口-城铁立水桥站-立水桥北站-立水桥-大羊坊-北苑-辛店村-科荟路东口-华汇商厦-慧忠北里-大屯南-炎黄艺术馆-安慧桥(length:67)
07-21 11:38:56.395: I/txrjsms(24778): 北-安慧桥东-惠新里-对外经贸大学-中日医院-太阳宫桥-西坝河-静安庄-三元桥-燕莎桥南-亮马桥-农业展览馆-团结湖-甜水园街北口-甜(length:67)
07-21 11:38:56.405: I/txrjsms(24778): 水园北里-金台路口南-红庙路口北-八王坟北-四惠枢纽站 (43站)
07-21 11:38:56.405: I/txrjsms(24778): 回程:四惠枢纽站-八王坟北-红庙路口北-金台路口南-甜水园北里-甜(length:67)
07-21 11:38:56.425: I/txrjsms(24778): 水园街北口-团结湖-农业展览馆-亮马桥-燕莎桥南-三元桥-静安庄-西坝河-和平东桥北-中日医院-对外经贸大学-惠新里-安苑东里-安慧桥(length:67)
07-21 11:38:56.435: I/txrjsms(24778): 北-炎黄艺术馆-大屯南-慧忠北(length:15) -
2013年7月22日 上午 测验发送长短信成功(短信中没有*号,避免违禁内容才加上*号)
-
07-22 07:00:51.828: E/txrjsms(6251): MessageListActivity.sendMultipartTextMessage
07-22 07:00:51.828: E/txrjsms(6251): divide into 2 parts.
07-22 07:00:51.828: I/txrjsms(6251): 中华人民共和国中央军事委员会主席毛*泽东。 中华人民共和国中央军事委员会主席毛*泽东。 中华人民共和国中央军事委员会主席毛*泽东。 中华人民(length:67)
07-22 07:00:51.828: I/txrjsms(6251): 共和国中央军事委员会主席毛*泽东。 中华人民共和国中央军事委员会主席毛*泽东。(length:37)
07-22 07:00:51.828: E/txrjsms(6251): send long message.
07-22 07:00:55.582: E/txrjsms(6251): send (1/2) msg success.
07-22 07:01:00.586: E/txrjsms(6251): send (2/2) msg success.
07-22 07:01:05.121: E/txrjsms(6251): MessageListActivity.onPause
07-22 07:01:05.271: E/txrjsms(6251): MessageListActivity.onResume
07-22 07:01:05.281: E/txrjsms(6251): ShowSmsActivity.onDestroy // 因为此短信已经读过,所以不再弹窗显示出来。 -
07-22 07:05:33.202: E/txrjsms(6251): MessageListActivity.sendMultipartTextMessage
07-22 07:05:33.202: E/txrjsms(6251): divide into 2 parts.
07-22 07:05:33.202: I/txrjsms(6251): 中华人民共和国中央军事委员会主席毛*泽东。中华人民共和国中央军事委员会主席毛*泽东。中华人民共和国中央军事委员会主席毛*泽东。中华人民共和国(length:67)
07-22 07:05:33.202: I/txrjsms(6251): 中央军事委员会主席毛*泽东。中华人民共和国中央军事委员会主席毛*泽东。(length:33)
07-22 07:05:33.202: E/txrjsms(6251): send long message.
07-22 07:05:37.326: E/txrjsms(6251): send (1/2) msg success.
07-22 07:05:41.841: E/txrjsms(6251): send (2/2) msg success.
07-22 07:05:46.746: E/txrjsms(6251): MessageListActivity.onPause
07-22 07:05:47.086: E/txrjsms(6251): MessageListActivity.onResume
07-22 07:05:47.086: E/txrjsms(6251): ShowSmsActivity.onDestroy -
两次发送长短信都成功,但是内容有一点不同。第1次有4个空格,第2次没有空格。第1次比第2次多4个字符。
-
07-22 07:11:20.101: E/txrjsms(6251): MessageListActivity.sendMultipartTextMessage
07-22 07:11:20.101: E/txrjsms(6251): divide into 2 parts.
07-22 07:11:20.101: I/txrjsms(6251): 中华人民共和国中央军事委员会主席毛*泽东.中华人民共和国中央军事委员会主席毛*泽东.中华人民共和国中央军事委员会主席毛*泽东.中华人民共和国(length:67)
07-22 07:11:20.101: I/txrjsms(6251): 中央军事委员会主席毛*泽东.中华人民共和国中央军事委员会主席毛*泽东.(length:33)
07-22 07:11:20.101: E/txrjsms(6251): send long message.
07-22 07:11:23.824: E/txrjsms(6251): send (1/2) msg success.
07-22 07:11:28.799: E/txrjsms(6251): send (2/2) msg success.
android发送与接收超长短信的更多相关文章
- VB短信猫开发包,支持超长短信
一.短信猫开发包(长短信/异步调用)说明: 短信猫开发包以OCX控件的形式提供,支持Windows平台下常用的开发工具:如VB.VB.net.VC++.Power Builder.C#.DELPH ...
- SIM900A—发送、接收中英文短信
文章目录 一.SMS简介 二.短信的控制模式与编码 1.Text Mode 2.PDU Mode 3.GSM编码 4.UCS2编码 三.收发英文短信 1.AT+CPMS查询短信数量 2.AT+CNMI ...
- 中国网建SMS短信接口调用(java发送和接收手机短信)
1.先注册账号,一定要填写好签名格式.不填会返回-51错误. 代码信息接口详细==>http://sms.webchinese.cn/api.shtml . 2.测试代码 package ...
- android发送短信代码(短信内容超长处理)
一条短信只可容纳70个中文,所以当短信长度超过70个中文字符时程序就要特殊处理了. 有两种方式: 1.通过sendTextMessage()方法依次发送拆分后的短信,该方式有个弊端就是用户会分条收到短 ...
- CMPP3.0 长短信实现方案
长短信息:是指超过70个汉字,140个字节的信息内容 一.CMPP协议相关字段分析 CMPP协议具体部分请参考<中国移动互联网短信网关接口协议(V3.0.0).doc> CMPP_SUBM ...
- 利用Android Lost通过互联网或短信远程控制安卓设备
利用Android Lost通过互联网或短信远程控制安卓设备 作者:Jack Wallen| 杰克·瓦伦翻译:PurpleEndurer.2014-11-15第1版 使用智能手机要考虑的一个至关重要的 ...
- Android 短信模块分析(四) MMS之短信的发送与接收
MMS之短信的发送与接收分析: 一.信息发送: com.android.mms.data.WorkingMessage.java 类 send()函数: public void send() { . ...
- android 发送短信的两种方式,以及接收报告和发送报告
android发送短信,以及接收报告和发送报告 android中发送短信其实有两种方式,这个和打电话类似,大家可以了解一下: 一.调起系统发短信功能 ...
- android基础---->发送和接收短信
收发短信应该是每个手机最基本的功能之一了,即使是许多年前的老手机也都会具备这项功能,而Android 作为出色的智能手机操作系统,自然也少不了在这方面的支持.今天我们开始自己创建一个简单的发送和接收短 ...
随机推荐
- 生成学习算法(Generative Learning algorithms)
一.引言 前面我们谈论到的算法都是在给定\(x\)的情况下直接对\(p(y|x;\theta)\)进行建模.例如,逻辑回归利用\(h_\theta(x)=g(\theta^T x)\)对\(p(y|x ...
- iOS开发-App Icons的尺寸大小
每个App中Icon的尺寸大小是不一样的,如果你添加部分尺寸的Icon,有些没有添加,xCode会给出相应的警告,最近遇到一个问题就是A 76x76 app icon is required for ...
- Scramble String leetcode java
题目: Given a string s1, we may represent it as a binary tree by partitioning it to two non-empty subs ...
- mongodb 按配置文件mongodb.conf启动
命令如下 mongod --config /etc/mongodb.conf
- Hadoop概念学习系列之Hadoop、Spark学习路线(很值得推荐)
说在前面的话 此笔,对于仅对于Hadoop和Spark初中学者.高手请忽略! 1 Java基础: 视频方面: 推荐<毕向东JAVA基础视频教程>.学习hadoop不需要过 ...
- 【站长起步】阿里云+Ubuntu+java 7+ Tomcat 7 +Nginx1.6 +Mysql 5.6
本文记载了在阿里云ubuntu+java 镜像环境下搭建站点server环境中遇到的的错误和解决方式. 作为一个年轻人,是肯定不会去用alidata这个现成的环境的.怎么办? 所有删除.立刻创建一个 ...
- 7.4 Javascript:表单验证-揭开正則表達式的面纱
用元字符匹配对应的字符类型 创建正則表達式有点像创建字符串字面量,仅仅只是正則表達式出如今一对"/"里 正則表達式中会用到一级元字符.用于连接字母与数字 "." ...
- Dubbo-Fail to decode request due to: RpcInvocation
使用Dubbo进行服务化,遇到如下错误: Caused by: com.alibaba.dubbo.remoting.RemotingException: Fail to decode request ...
- 跟我学AngularJS:全局变量设置之value vs constant vs rootscope vs 服务[转]
林炳文Evankaka原创作品.转载请注明出处http://blog.csdn.net/evankaka 摘要:本文要讲讲Angular中value vs. constant以及全局变量的设置 本教程 ...
- ngx_http_upstream_keepalive
链接:http://wiki.nginx.org/HttpUpstreamKeepaliveModule 今天看了一些代码: upstream b_memc2 { server ; keepalive ...