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 "";
}
流程大致:存数据库时根据编码生成文本,取数据库时根据编码把文本转成字节数组,显示时根据编码把字节数组转成文本。
疑惑与可能存在的问题:把字符串存到数据库时是否会乱码,之后再取出时是否还是原来的编码。