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 of PendingIntents (one for each message part) that is broadcast when the corresponding message part has been sent.
deliveryIntents if not null, an ArrayList of PendingIntents (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 log

07-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发送与接收超长短信的更多相关文章

  1. VB短信猫开发包,支持超长短信

    一.短信猫开发包(长短信/异步调用)说明:   短信猫开发包以OCX控件的形式提供,支持Windows平台下常用的开发工具:如VB.VB.net.VC++.Power Builder.C#.DELPH ...

  2. SIM900A—发送、接收中英文短信

    文章目录 一.SMS简介 二.短信的控制模式与编码 1.Text Mode 2.PDU Mode 3.GSM编码 4.UCS2编码 三.收发英文短信 1.AT+CPMS查询短信数量 2.AT+CNMI ...

  3. 中国网建SMS短信接口调用(java发送和接收手机短信)

    1.先注册账号,一定要填写好签名格式.不填会返回-51错误.   代码信息接口详细==>http://sms.webchinese.cn/api.shtml   . 2.测试代码 package ...

  4. android发送短信代码(短信内容超长处理)

    一条短信只可容纳70个中文,所以当短信长度超过70个中文字符时程序就要特殊处理了. 有两种方式: 1.通过sendTextMessage()方法依次发送拆分后的短信,该方式有个弊端就是用户会分条收到短 ...

  5. CMPP3.0 长短信实现方案

    长短信息:是指超过70个汉字,140个字节的信息内容 一.CMPP协议相关字段分析 CMPP协议具体部分请参考<中国移动互联网短信网关接口协议(V3.0.0).doc> CMPP_SUBM ...

  6. 利用Android Lost通过互联网或短信远程控制安卓设备

    利用Android Lost通过互联网或短信远程控制安卓设备 作者:Jack Wallen| 杰克·瓦伦翻译:PurpleEndurer.2014-11-15第1版 使用智能手机要考虑的一个至关重要的 ...

  7. Android 短信模块分析(四) MMS之短信的发送与接收

     MMS之短信的发送与接收分析: 一.信息发送: com.android.mms.data.WorkingMessage.java 类 send()函数: public void send() { . ...

  8. android 发送短信的两种方式,以及接收报告和发送报告

               android发送短信,以及接收报告和发送报告          android中发送短信其实有两种方式,这个和打电话类似,大家可以了解一下:    一.调起系统发短信功能    ...

  9. android基础---->发送和接收短信

    收发短信应该是每个手机最基本的功能之一了,即使是许多年前的老手机也都会具备这项功能,而Android 作为出色的智能手机操作系统,自然也少不了在这方面的支持.今天我们开始自己创建一个简单的发送和接收短 ...

随机推荐

  1. pthread_create 报函数参数不匹配问题

    pthread_create方法遇到类方法时总会报  argument of type ‘void* (Thread::)(void*)’ does not match ‘void* (*)(void ...

  2. go语言之进阶篇通过select实现斐波那契数列

    一.select作用 Go里面提供了一个关键字select,通过select可以监听channel上的数据流动. select的用法与switch语言非常类似,由select开始一个新的选择块,每个选 ...

  3. ASP.NET网页中RAR、DOC、PDF等文件下载功能实例源代码

    以前做asp.net下载功能的时候都是采用:<a href="http://www.wang0214.com/wgcms">下载</a>的方式来实现下载. ...

  4. iOS开发-UITapGestureRecognizer手势

    手势在iOS开发中是一个比较常用的功能,不过相对来说大家用的比较少,经常刷网易新闻,上次用了一下捏合手势才发现可以调整字体大小.昨天看到一个介绍摇一摇这个功能的,没看到之前一直都觉得摇一摇是微信的专有 ...

  5. JavaScript Math和Number对象研究

    1. Math 对象 1.1 介绍   Math 对象,是数学对象,提供对数据的数学计算,如:获取绝对值.向上取整等.无构造函数,无法被初始化,只提供静态属性和方法.   1.2 构造函数   无 : ...

  6. Android -- 获取视频第一帧缩略图

    干货 从API 8开始,新增了一个类: android.media.ThumbnailUtils这个类提供了3个静态方法一个用来获取视频第一帧得到的Bitmap,2个对图片进行缩略处理. public ...

  7. ASP入门(十)-Session对象

    在ASP中,有两个内部对象可以进行一些信息存储,它们是 Application 对象和 Session 对象,其中 Application 对象是对于整个应用程序期间而言的,它对于所有访问网站的用户来 ...

  8. Robotframework(4):创建变量的类型和使用

    转载:http://www.cnblogs.com/CCGGAAG/p/7800321.html 实际的测试过程中,编写脚本时,我们需要创建一些变量来暂时或者永久性的存储数据,那么在Robotfram ...

  9. PyCharm安装第三方库如Requests

    转载: https://blog.csdn.net/fx677588/article/details/56830929 PyCharm安装第三方库是十分方便的,无需pip或其他工具,平台就自带了这个功 ...

  10. ExtJS学习笔记2:响应事件、使用AJAX载入数据

    响应事件: 1.设置一个html标记 <div id="my-div">Ext JS 4 Cookbook</div> 2.使用get函数获取此标记对象 v ...