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的更多相关文章

  1. android.telephony.SmsManager 短信笔记

    android 几种发送短信的方法 http://www.oschina.net/question/163910_27409 <uses-permission android:name=&quo ...

  2. Android Telephony分析(七) ---- 接口扩展(异步转同步)

    本文是基于上一篇<Android Telephony分析(六) —- 接口扩展(实践篇)>来写的.上一篇介绍的接口扩展的方法需要实现两部分代码:1. 从APP至RIL,发送请求:2. 从R ...

  3. Android Telephony分析(六) ---- 接口扩展(实践篇)

    本文将结合前面五篇文章所讲解的知识,综合起来,实现一个接口扩展的功能.如果还没有阅读过前面五篇文章的内容,请先阅读:<Android Telephony分析(一) — Phone详解 >& ...

  4. Android Telephony分析(五) ---- TelephonyRegistry详解

    本文紧接着上一篇文章<Android Telephony分析(四) —- TelephonyManager详解 >的1.4小节.从TelephonyRegistry的大部分方法中: 可以看 ...

  5. Android Telephony分析(四) ---- TelephonyManager详解

    前言 TelephonyManager主要提供Telephony相关信息的查询/修改功能,以及Phone状态监听功能,封装的方法主要是提供给APP上层使用.TelephonyManager.java ...

  6. Android Telephony分析(三) ---- RILJ详解

    前言 本文主要讲解RILJ工作原理,以便更好地分析代码,分析业务的流程.这里说的RILJ指的是RIL.java (frameworks\opt\telephony\src\java\com\andro ...

  7. Android Telephony分析(二) ---- RegistrantList详解

    前言 本文主要讲解RegistrantList的原理,以及如何快速分析RegistrantList相关的代码流程.在Telephony模块中,在RIL.Tracker(ServiceStateTrac ...

  8. Android Telephony —— 手机信号实时变化源码分析过程记录

    源码版本:4.4 跳过InCallActivity等UI实现.先看service以及底层. 1, 在frameworks/opt下面会发现如下文件列表: ./telephony/src/java/co ...

  9. Android Telephony分析(一) ---- Phone详解

    目录: Phone的继承关系与PhoneFactory(GsmCdmaPhone.ImsPhone.SipPhone) Phone进程的启动 Phone对象的初始化(DefaultPhoneNotif ...

随机推荐

  1. ubuntu16.04下部署tomcat9和java8启动一次需要七八分钟

    一.环境如下 Ubuntu16.04  +tomcat9+openjdk1.8 二.问题 在tomcat的bin下执行./startup.sh 如下图没有问题 root@bogon:/usr/apac ...

  2. JavaScript 判断一个对象{}是否为空对象的简单方法

    第一种: function isEmptyObject(obj) { for (var key in obj) { //返回false,不为空对象 return false; } return tru ...

  3. 删除数据库mysql

    drop命令用于删除数据库. drop命令格式:drop database <数据库名>; 例如,删除名为 xhkdb的数据库:mysql> drop database xhkdb; ...

  4. log4j.xml写入数据库,只有SQL和参数,无其他信息

    <?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE log4j:configuration SY ...

  5. 初始化android studio的方法

    有可能是在一次android studio被我强制关闭以后,我的android studio就出现了各种诡异的问题,项目无法运行,新建的项目报错,等等.抓狂~~ 于是想到把android studio ...

  6. linux2.6.30.4内核移植(4)——完善串口驱动

    在内核里支持两个串口,也就是芯片的UART0和UART1,而UART2的驱动是针对红外接口的,而不是串口驱动,这里将其修改为串口驱动. 一.修改内核源码arch/arm/mach-s3c2440/ma ...

  7. 去掉JAVA部分依赖的事例

    一.现象 最近做JAVA项目,需要依赖一个外部的JAR包,但是依赖之后,发现eclipse一直workspace,估计是包重复加载的问题 二.问题 使用查看包依赖的命令:mvn dependency: ...

  8. Hadoop创建新用户

    HDFS本身并没有提供用户名.组等的创建和管理,在客户端操作Hadoop时,Hadoop自动识别执行命令所在的进程的用户名和用户组,然后检查是否具有权限.启动Hadoop的用户即为超级用户,可以进行所 ...

  9. spring mvc防止表单重复提交的代码片段

    1.定义一个token接口 package com.bigbigrain.token; import java.lang.annotation.Documented; import java.lang ...

  10. Laravel返回不重复的某个字段信息列表

    ->groupBy('brand_id') ->pluck('brand_id');