MMS存储与显示

Android4.2

1.存彩信

NotificationTransaction.java 是自动下载彩信的类,在下载完所有数据后调用解析

GenericPdu pdu = new PduParser(retrieveConfData).parse();

GenericPdu中有PduBody,PduBody中有PduPart,解析时把字符内容存成字节数组,没做字符编码。之后调用

                    Uri uri = p.persist(pdu, Inbox.CONTENT_URI, true,
                            MessagingPreferenceActivity.getIsGroupMmsEnabled(mContext), null);
存储pdu内容。在persist方法中会调用persistPart方法存储PduPart内容到数据库,persistPart方法内在存储字节数组时会调用
        persistData(part, res, contentType, preOpenedFiles);
此方法内会把图片等存成文件,文字存到数据库,存之前有编码行为。原生的直接编成UTF-8,展讯做法
                if (charset == CharacterSets.UTF_16) {
                    cv.put(Telephony.Mms.Part.TEXT, new EncodedStringValue(charset, data).getString());
                } else {
                    cv.put(Telephony.Mms.Part.TEXT, new EncodedStringValue(data).getString());
                }

2显示彩信

MessageItem的mBody字段为彩信文字内容,在PduLoaderManager的$PduTask的run方法中

                pdu = mPduPersister.load(mUri);
                if (pdu != null && mRequestSlideshow) {
                    slideshow = SlideshowModel.createFromPduBody(mContext,
                            ((MultimediaMessagePdu)pdu).getBody());
                }
通过PduPersister获取彩信的内容并生成slideshow对象,在PduPersister的loadFromDB方法内
            if ((msgType == PduHeaders.MESSAGE_TYPE_RETRIEVE_CONF)
                    || (msgType == PduHeaders.MESSAGE_TYPE_SEND_REQ)) {
                PduPart[] parts = loadParts(msgId);
                if (parts != null) {
                    int partsNum = parts.length;
                    for (int i = 0; i < partsNum; i++) {
                        body.addPart(parts[i]);
                    }
                }
            }
body用来生成GenericPdu对象,MESSAGE_TYPE_RETRIEVE_CONF(132)与MESSAGE_TYPE_SEND_REQ(128)分别代表收到的与发送的彩信。

在loadParts方法内读取数据库的text字段并根据编码转成byte字节数组存到PduPart中

                        int charSet = part.getCharset();
                        try {
                            blob = text.getBytes(CharacterSets.getMimeName(charSet));
                        } catch (UnsupportedEncodingException e) {
                            blob = text.getBytes();
                        }

最后在TextModel构造时又根据编码构造字符串

    private CharSequence extractTextFromData(byte[] data) {
        if (data != null) {
            try {
                if (CharacterSets.ANY_CHARSET == mCharset) {
                    return new String(data); // system default encoding.
                } else {
                    String name = CharacterSets.getMimeName(mCharset);
                    return new String(data, name);
                }
            } catch (UnsupportedEncodingException e) {
                Log.e(TAG, "Unsupported encoding: " + mCharset, e);
                return new String(data); // system default encoding.
            }
        }
        return "";
    }


流程大致:存数据库时根据编码生成文本,取数据库时根据编码把文本转成字节数组,显示时根据编码把字节数组转成文本。

疑惑与可能存在的问题:把字符串存到数据库时是否会乱码,之后再取出时是否还是原来的编码。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值