Android接收彩信時解析PDU的過程記錄

彩信是以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到數據庫
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章