彩信是以PDU數據包的方式傳輸的,因此接收彩信的過程也就是解析PDU的過程,解析PDU的方法在PduParser.parse()中。通過HTTP請求下載到彩信的PDU,裝入到ByteArrayInputStream字節流中,對該字節流按照PDU的數據包格式逐一解析。
1、通過protected PduHeaders parseHeaders(ByteArrayInputStream pduDataStream){...}方法,獲取PDU的包頭
2、protected PduBody parseParts(ByteArrayInputStream pduDataStream) {...}方法獲取PDUbody,body中包含了彩信的所有附件Part
protected PduBody parseParts(ByteArrayInputStream pduDataStream) {
PduBody body = new PduBody();
int count = parseUnsignedInt(pduDataStream);//獲取Part的個數
for(int i = 0; i < count; i++){
/* parse part's content-type */
HashMap<Integer, Object> map = new HashMap<Integer, Object>();
byte[] contentType = parseContentType(pduDataStream, map);//parseContentType中調用parseContentTypeParams方法,會解析出Part相關的各個字段,包括name,cid,cl等等
/* get name parameter */
byte[] name = (byte[]) map.get(PduPart.P_NAME);
if (null != name) {
part.setName(name);
}
/* get charset parameter */
Integer charset = (Integer) map.get(PduPart.P_CHARSET);
if (null != charset) {
part.setCharset(charset);
}
//通過類似的方式將各個字段放入part中
//接下來將附件的文件內容存入文件
}
}
3、通過上面的方法,解析出彩信的所有內容,然後通過PduPersist.persist()方法將彩信內容寫入數據庫,該方法會調用如下方法,逐一將PduPart寫入數據庫
public Uri persistPart(PduPart part, Uri uri, HashMap<Uri, InputStream> preOpenedFiles){
ContentValues values = new ContentValues();
values.put(Part.CHARSET, part.getCharset());
...//依次獲取各個字節
//最後insert到數據庫
}