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
PendingIntent
is broadcast when the message is sucessfully sent, or failed. 信息发送成功或失败触发 - deliveryIntent if not NULL this
PendingIntent
is 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
ArrayList
of strings that, in order, comprise the original message - sentIntents if not null, an
ArrayList
ofPendingIntent
s (one for each message part) that is broadcast when the corresponding message part has been sent. - deliveryIntents if not null, an
ArrayList
ofPendingIntent
s (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 作为出色的智能手机操作系统,自然也少不了在这方面的支持.今天我们开始自己创建一个简单的发送和接收短 ...
随机推荐
- Python Configparser模块读取、写入配置文件
写代码中需要用到读取配置,最近在写python,记录一下. 如下,假设有这样的配置. [db] db_host=127.0.0.1 db_port=3306 db_user=root db_pass= ...
- vNetwork Standard Switch(vSS)和vNetwork Distributed Switch(vDS)的区别
vSS: vSwitches are configured on each ESXi/ESX host. vDS: The configuration of vDS is centralized to ...
- Kaggle网站流量预测任务第一名解决方案:从模型到代码详解时序预测
Kaggle网站流量预测任务第一名解决方案:从模型到代码详解时序预测 2017年12月13日 17:39:11 机器之心V 阅读数:5931 近日,Artur Suilin 等人发布了 Kaggl ...
- Trie树分词
http://www.hankcs.com/program/java/tire-tree-participle.html 最近在看Ansj中文分词的源码,以前没有涉足过这个领域,所以需要做一些笔记. ...
- PKU-2104-K-th Number
K-th Number Time Limit: 20000MS Memory Limit: 65536K Total Submissions: 36045 Accepted: 11522 Ca ...
- Material Design学习之 ProgreesBar
转载奇怪注明出处:王亟亟的大牛之路 继续我们Material Design的内容,这一篇讲的是进度条,上一篇是Switch地址例如以下:http://blog.csdn.net/ddwhan0123/ ...
- centos6默认python2.6升级2.7 卸载python2.6升级2.7
转自:http://blog.csdn.net/u010098331/article/details/52190354 本文介绍CentOS 6.3从自带的Pyhon版本是2.6升级到2.7.6的方法 ...
- 五毛党可能要失业了,因为AI水军来了
当AI已经开始写稿.唱歌.翻译文章.把语音转录为文字的时候,我们其实应该清醒的认识到,五毛党要消亡了. 相信大部分人和小编一样,现在只要出门吃饭,就会打开大众点评搜好吃的,看评分,看网友的评论.一般来 ...
- Android 获得图片并解码成缩略图以减少内存消耗
本文内容 环境 演示 下载 Demo 环境 Windows 2008 R2 64 位 Eclipse ADT V22.6.2,Android 4.4.3 SAMSUNG GT-I9008L,Andro ...
- HDU1069(还是dp基础)
今天不想说太多废话-由于等下要写自己主动提交机. 不知道能不能成功呢? 题目的意思就是,一个猴子,在叠砖头 ...以下的要严格大于上面的.求叠起来最高能到多少- n非常少,n^2算法毫无压力-话说dp ...