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);

posted on 2013-07-21 23:46  勤修  阅读(2848)  评论(0编辑  收藏  举报

导航