android.telephony.SmsManager.sendMultipartTextMessage
smsManager.sendMultipartTextMessage(destAddress, null, divideContents, sentIntents, null);
next step --
android.telephony.SmsManager
public void sendMultipartTextMessage(    
        String destinationAddress, String scAddress, ArrayList<String> parts,    
        ArrayList<PendingIntent> sentIntents, ArrayList<PendingIntent> deliveryIntents) {    
    if (TextUtils.isEmpty(destinationAddress)) {    
        throw new IllegalArgumentException("Invalid destinationAddress");    
    }    
    if (parts == null || parts.size() < 1) {    
        throw new IllegalArgumentException("Invalid message body");    
    }
    if (parts.size() > 1) {   
        try {    
            ISms iccISms = ISms.Stub.asInterface(ServiceManager.getService("isms"));    
            if (iccISms != null) {    
                iccISms.sendMultipartText(destinationAddress, scAddress, parts,    
                        sentIntents, deliveryIntents);    
            }    
        } catch (RemoteException ex) {    
            // ignore it    
        }    
    } else {    
        PendingIntent sentIntent = null;    
        PendingIntent deliveryIntent = null;    
        if (sentIntents != null && sentIntents.size() > 0) {    
            sentIntent = sentIntents.get(0);    
        }    
        if (deliveryIntents != null && deliveryIntents.size() > 0) {    
            deliveryIntent = deliveryIntents.get(0);    
        }    
        sendTextMessage(destinationAddress, scAddress, parts.get(0),    
                sentIntent, deliveryIntent);    
    }    
}
next step --
com.android.internal.telephony.IccSmsInterfaceManager
public void sendMultipartText(String destAddr, String scAddr, List<String> parts,    
        List<PendingIntent> sentIntents, List<PendingIntent> deliveryIntents) {    
    mPhone.getContext().enforceCallingPermission(    
            "android.permission.SEND_SMS",    
            "Sending SMS message");    
    if (Log.isLoggable("SMS", Log.VERBOSE)) {    
        int i = 0;    
        for (String part : parts) {    
            log("sendMultipartText: destAddr=" + destAddr + ", srAddr=" + scAddr +    
                    ", part[" + (i++) + "]=" + part);    
        }    
    }    
    mDispatcher.sendMultipartText(destAddr, scAddr, (ArrayList<String>) parts,    
            (ArrayList<PendingIntent>) sentIntents, (ArrayList<PendingIntent>) deliveryIntents);    
}
next step --
com.android.internal.telephony.SmsDispatcher
protected void sendMultipartText(String destAddr, String scAddr,    
        ArrayList<String> parts, ArrayList<PendingIntent> sentIntents,    
        ArrayList<PendingIntent> deliveryIntents) {
    int refNumber = getNextConcatenatedRef() & 0x00FF;   
    int msgCount = parts.size();    
    int encoding = android.telephony.SmsMessage.ENCODING_UNKNOWN;
mRemainingMessages = msgCount;
    TextEncodingDetails[] encodingForParts = new TextEncodingDetails[msgCount];   
    for (int i = 0; i < msgCount; i++) {    
        TextEncodingDetails details = calculateLength(parts.get(i), false);    
        if (encoding != details.codeUnitSize    
                && (encoding == android.telephony.SmsMessage.ENCODING_UNKNOWN    
                        || encoding == android.telephony.SmsMessage.ENCODING_7BIT)) {    
            encoding = details.codeUnitSize;    
        }    
        encodingForParts[i] = details;    
    }
    for (int i = 0; i < msgCount; i++) {   
        SmsHeader.ConcatRef concatRef = new SmsHeader.ConcatRef();    
        concatRef.refNumber = refNumber;    
        concatRef.seqNumber = i + 1;  // 1-based sequence    
        concatRef.msgCount = msgCount;    
        // TODO: We currently set this to true since our messaging app will never    
        // send more than 255 parts (it converts the message to MMS well before that).    
        // However, we should support 3rd party messaging apps that might need 16-bit    
        // references    
        // Note:  It's not sufficient to just flip this bit to true; it will have    
        // ripple effects (several calculations assume 8-bit ref).    
        concatRef.isEightBits = true;    
        SmsHeader smsHeader = new SmsHeader();    
        smsHeader.concatRef = concatRef;
        // Set the national language tables for 3GPP 7-bit encoding, if enabled.   
        if (encoding == android.telephony.SmsMessage.ENCODING_7BIT) {    
            smsHeader.languageTable = encodingForParts[i].languageTable;    
            smsHeader.languageShiftTable = encodingForParts[i].languageShiftTable;    
        }
        PendingIntent sentIntent = null;   
        if (sentIntents != null && sentIntents.size() > i) {    
            sentIntent = sentIntents.get(i);    
        }
        PendingIntent deliveryIntent = null;   
        if (deliveryIntents != null && deliveryIntents.size() > i) {    
            deliveryIntent = deliveryIntents.get(i);    
        }
        sendNewSubmitPdu(destAddr, scAddr, parts.get(i), smsHeader, encoding,   
                sentIntent, deliveryIntent, (i == (msgCount - 1)));    
    }
}
protected abstract void sendNewSubmitPdu(String destinationAddress, String scAddress,    
        String message, SmsHeader smsHeader, int encoding,    
        PendingIntent sentIntent, PendingIntent deliveryIntent, boolean lastPart);
android.telephony.SmsManager.sendMultipartTextMessage的更多相关文章
- android.telephony.SmsManager 短信笔记
		android 几种发送短信的方法 http://www.oschina.net/question/163910_27409 <uses-permission android:name=&quo ... 
- Android Telephony分析(七) ---- 接口扩展(异步转同步)
		本文是基于上一篇<Android Telephony分析(六) —- 接口扩展(实践篇)>来写的.上一篇介绍的接口扩展的方法需要实现两部分代码:1. 从APP至RIL,发送请求:2. 从R ... 
- Android Telephony分析(六) ---- 接口扩展(实践篇)
		本文将结合前面五篇文章所讲解的知识,综合起来,实现一个接口扩展的功能.如果还没有阅读过前面五篇文章的内容,请先阅读:<Android Telephony分析(一) — Phone详解 >& ... 
- Android Telephony分析(五) ---- TelephonyRegistry详解
		本文紧接着上一篇文章<Android Telephony分析(四) —- TelephonyManager详解 >的1.4小节.从TelephonyRegistry的大部分方法中: 可以看 ... 
- Android Telephony分析(四) ---- TelephonyManager详解
		前言 TelephonyManager主要提供Telephony相关信息的查询/修改功能,以及Phone状态监听功能,封装的方法主要是提供给APP上层使用.TelephonyManager.java ... 
- Android Telephony分析(三) ---- RILJ详解
		前言 本文主要讲解RILJ工作原理,以便更好地分析代码,分析业务的流程.这里说的RILJ指的是RIL.java (frameworks\opt\telephony\src\java\com\andro ... 
- Android Telephony分析(二) ---- RegistrantList详解
		前言 本文主要讲解RegistrantList的原理,以及如何快速分析RegistrantList相关的代码流程.在Telephony模块中,在RIL.Tracker(ServiceStateTrac ... 
- Android Telephony —— 手机信号实时变化源码分析过程记录
		源码版本:4.4 跳过InCallActivity等UI实现.先看service以及底层. 1, 在frameworks/opt下面会发现如下文件列表: ./telephony/src/java/co ... 
- Android Telephony分析(一) ---- Phone详解
		目录: Phone的继承关系与PhoneFactory(GsmCdmaPhone.ImsPhone.SipPhone) Phone进程的启动 Phone对象的初始化(DefaultPhoneNotif ... 
随机推荐
- Redhat Linux NFS配置
			Linux下,All deviceis file,所有的设备都是文件.当我们需要把某些文件夹就或者文件共享给其他用户,就可以使用网络文件系统. 本文介绍Redhat Linux下的NFS配置. 在使用 ... 
- json schema校验
			工作中使用到了json schema格式校验的问题,在网上查了些资料,结合自己的理解记录一下. json schema可以对json结果字符串做出一些约束,例如: 1. 值类型是:array, obj ... 
- Java语言:JAVA8 十大新特性详解(zz)
			关键词: Lambda表达式.函数式接口.方法与构造函数引用.接口的默认方法 原文地址: http://www.jb51.net/article/48304.htm 本教程将Java8的新特新逐一列出 ... 
- Linux中如何查看文件夹的大小
			直接查看当前文件夹的大小: du –sh 只看文件夹的名字里包含某字符串的子文件夹的大小: du –h –d 1 | grep "BACKEND" 我的linux系统被阉割的比较厉 ... 
- Java 读取某个目录下所有文件、文件夹
			/** * @Author: * @Description:获取某个目录下所有直接下级文件,不包括目录下的子目录的下的文件,所以不用递归获取 * @Date: */ public static Lis ... 
- 创业公司做数据分析(四)ELK日志系统 (转)
			http://blog.csdn.net/zwgdft/article/details/53842574 作为系列文章的第四篇,本文将重点探讨数据采集层中的ELK日志系统.日志,指的是后台服务中产生的 ... 
- Mac下brew/memcached/nginx/iterm/zsh的安装
			brew https://www.cnblogs.com/fireworld/p/8609190.html memcached https://blog.csdn.net/whereismatrix ... 
- Giraph源代码分析(九)—— Aggregators 原理解析
			HamaWhite 原创.转载请注明出处!欢迎大家增加Giraph 技术交流群: 228591158 Giraph中Aggregator的基本使用方法请參考官方文档:http://giraph.apa ... 
- 【Python】torrentParser1.04 增加获得磁力链URI功能
			代码: #------------------------------------------------------------------------------------ # torrentP ... 
- 使用Snap.svg类库实现的抖动式的幻灯播放效果
			在线演示 本地下载 这个幻灯中,使用了SVG来生成具有动画弧度的幻灯背景效果,如果你在项目中能够支持现代浏览器的话,尝试一下这个效果吧,很赞! 想了解基础使用,观看这个轻视频吧:Snap.svg处理和 ... 
