insert Vodafone sim card,open the mms read report,when receive the read report,cann't download the message

Test steps:

1.insert Vodafone sim card

2.open the mms read report

3.send the mms successfully

4.when receive the read report

这里的环境须要描写叙述一下:在国内不会出现这个问题,该问题在土耳其測试发现,经过分析主要因国内外网络差异导致。

问题大概意思是在国外发送一条彩信。对方成功接收。发送方測试会接收一条阅读报告。

该阅读报告是以彩信的方式接收。这个时候问题来了。彩信无法自己主动下载,点击下载button也无法完毕下载(这里从界面时的确能够这么理解,分析代码之后才发现彩信数据已经下载成功,仅仅是在解析的时候格式不兼容导致解析发生异常,返回null。

因此经过分析打开NotificationTransaction.java中的log,从log中得到已经下载好的彩信数据,然后在国内用此模拟数据来解决这个问题。

if (retrieveConfData != null) {(这里加入凝视的意思也就是在这里输出log,得到国外模拟数据,然后在国内进行模拟測试)

                //if (Log.isLoggable(LogTag.TRANSACTION, Log.DEBUG)) {

                    Log.v(TAG, "NotificationTransaction: retrieve data=" +

                            HexDump.dumpHexString(retrieveConfData));//HexDump这个工具类非常重要。假设有时间大家细致阅读一下源代码(能够将16进制字符串和字节数组进行转换)

//}

当然,终于改动解决这个问题的实在解析pdu和持久化保存的PduParser.java类。

case PduHeaders.MESSAGE_TYPE_RETRIEVE_CONF:

                if (LOCAL_LOGV) {

                    Log.v(LOG_TAG, "parse: MESSAGE_TYPE_RETRIEVE_CONF");

                }

                RetrieveConf retrieveConf =

                    new RetrieveConf(mHeaders, mBody);



                byte[] contentType = retrieveConf.getContentType();

                if (null == contentType) {

                    if (LOCAL_LOGV)

                        Log.v(LOG_TAG, "contentType is null");

                    return null;

                }

                String ctTypeStr = new String(contentType);

                if (LOCAL_LOGV)

                    Log.v(LOG_TAG, "ctTypeStr is l"+ctTypeStr);

                if (ctTypeStr.equals(ContentType.MULTIPART_MIXED)

                        || ctTypeStr.equals(ContentType.MULTIPART_RELATED)

                        || ctTypeStr.equals(ContentType.TEXT_PLAIN)//这里是加入对“text/plain”格式彩信的兼容

                        || ctTypeStr.equals(ContentType.MULTIPART_ALTERNATIVE)) {

                    // The MMS content type must be "application/vnd.wap.multipart.mixed"

                    // or "application/vnd.wap.multipart.related"

                    // or "application/vnd.wap.multipart.alternative"

                    return retrieveConf;

                } else if (ctTypeStr.equals(ContentType.MULTIPART_ALTERNATIVE)) {

                    // "application/vnd.wap.multipart.alternative"

                    // should take only the first part.

                    PduPart firstPart = mBody.getPart(0);

                    mBody.removeAll();

                    mBody.addPart(0, firstPart);

                    return retrieveConf;

                }

                return null;

以下这发现异常的时候忽视异常:

protected static PduBody parseParts(ByteArrayInputStream pduDataStream) {

        if (pduDataStream == null) {

            if (LOCAL_LOGV)

                Log.v(LOG_TAG, "pduDataStream is null");

            return null;

        }



        int count = parseUnsignedInt(pduDataStream); // get the number of parts

        PduBody body = new PduBody();



        for (int i = 0 ; i < count ; i++) {

            int headerLength = parseUnsignedInt(pduDataStream);

            int dataLength = parseUnsignedInt(pduDataStream);

            PduPart part = new PduPart();

            int startPos = pduDataStream.available();

            if (startPos <= 0) {

                // Invalid part.

                return body;//这里原本是返回null

            }




            /* parse part's content-type */

            HashMap<Integer, Object> map = new HashMap<Integer, Object>();

            byte[] contentType = parseContentType(pduDataStream, map);

            if (null != contentType) {

                part.setContentType(contentType);

            } else {

                if (LOCAL_LOGV)

                    Log.v(LOG_TAG, "contentType isn't null");

                part.setContentType((PduContentTypes.contentTypes[0]).getBytes()); //"*/*"

            }



            /* get name parameter */

            byte[] name = (byte[]) map.get(PduPart.P_NAME);

            if (null != name) {

                part.setName(name);

            }

            else{

                if (LOCAL_LOGV)

                    Log.v(LOG_TAG, "name isn't null");

            }

            /* get charset parameter */

            Integer charset = (Integer) map.get(PduPart.P_CHARSET);

            if (null != charset) {

                part.setCharset(charset);

            }

            else{

                if (LOCAL_LOGV)

                    Log.v(LOG_TAG, "charset isn't null");

            }

            /* parse part's headers */

            int endPos = pduDataStream.available();

            int partHeaderLen = headerLength - (startPos - endPos);

            if (partHeaderLen > 0) {

                if (false == parsePartHeaders(pduDataStream, part, partHeaderLen)) {

                    // Parse part header faild.

                    if (LOCAL_LOGV)

                        Log.v(LOG_TAG, "Parse part header faild.");

                    //return null;

                }

            } else if (partHeaderLen < 0) {

                // Invalid length of content-type.

                if (LOCAL_LOGV)

                    Log.v(LOG_TAG, "Invalid length of content-type.");

                //return null;

            }



            /* FIXME: check content-id, name, filename and content location,

             * if not set anyone of them, generate a default content-location

             */

            if ((null == part.getContentLocation())

                    && (null == part.getName())

                    && (null == part.getFilename())

                    && (null == part.getContentId())) {

                part.setContentLocation(Long.toOctalString(

                        System.currentTimeMillis()).getBytes());

            }



            /* get part's data */

            if (dataLength > 0) {

                byte[] partData = new byte[dataLength];

                String partContentType = new String(part.getContentType());

                pduDataStream.read(partData, 0, dataLength);

                if (partContentType.equalsIgnoreCase(ContentType.MULTIPART_ALTERNATIVE)) {

                    // parse "multipart/vnd.wap.multipart.alternative".

                    PduBody childBody = parseParts(new ByteArrayInputStream(partData));

                    // take the first part of children.

                    part = childBody.getPart(0);

                } else {

                    // Check Content-Transfer-Encoding.

                    byte[] partDataEncoding = part.getContentTransferEncoding();

                    if (null != partDataEncoding) {

                        String encoding = new String(partDataEncoding);

                        if (encoding.equalsIgnoreCase(PduPart.P_BASE64)) {

                            // Decode "base64" into "binary".

                            partData = Base64.decodeBase64(partData);

                        } else if (encoding.equalsIgnoreCase(PduPart.P_QUOTED_PRINTABLE)) {

                            // Decode "quoted-printable" into "binary".

                            partData = QuotedPrintable.decodeQuotedPrintable(partData);

                        } else {

                            // "binary" is the default encoding.

                        }

                    }

                    else{

                        if (LOCAL_LOGV)

                            Log.v(LOG_TAG, "partDataEncoding isn't null");

                    }

                    if (null == partData) {

                        log("Decode part data error!");

                        return null;

                    }

                    else{

                        if (LOCAL_LOGV)

                            Log.v(LOG_TAG, "partData isn't null");

                    }

                    part.setData(partData);

                }

            }



            if(LOCAL_LOGV)

                Log.v(LOG_TAG,"checkPartPosition is "+checkPartPosition(part));

            /* add this part to body */

            if (THE_FIRST_PART == checkPartPosition(part)) {

                /* this is the first part */

                body.addPart(0, part);

            } else {

                /* add the part to the end */

                body.addPart(part);

            }

        }



        return body;

    }

版权声明:本文博主原创文章,博客,未经同意不得转载。

解决:insert Vodafone sim card,open the mms read report,when receive the read report,cann&#39;t download..的更多相关文章

  1. 解决:insert Vodafone sim card,open the mms read report,when receive the read report,cann't download..

    insert Vodafone sim card,open the mms read report,when receive the read report,cann't download the m ...

  2. Windows 10 - View SIM Card Number

     If your device isn't running Windows 10, refer to the Windows 8 instructions. From the Windows desk ...

  3. 在Debian8.3中解决Odoo出现的问题:Unable to find Wkhtmltopdf on this system. The report will be shown in html.

    解决Odoo出现的问题:Unable to find Wkhtmltopdf on this system. The report will be shown in html. 下载wkhtmltop ...

  4. 解决insert语句插入时,需要写列值的问题

    今天发现解决这个问题其实很简单,闲话不多谈,我直接附上语句 ) select @s = isnull(@s+',', '') + [name] from syscolumns where id = o ...

  5. 论山寨手机与Android联姻 【8】 自己动手做XP手机

    2010年1月20日,ViewSonic在北京发布了一款真正意义的电脑手机VCP08.根据商家的宣传,VCP08之所以能够被称为真正的电脑手机,是因为“该机做到了把真正的WindowsXP操作系统嵌入 ...

  6. Arduino 3g shield using GSM bought from ITead

    This is an old arduino 3G module bought half years ago. Its wiki: http://wiki.iteadstudio.com/ITEAD_ ...

  7. android之GMS认证

    来到了新的公司,才知道做手机是须要做GMS认证的.于是从一个从没有做过GMS认证的小白到一个月做了8个项目的GMS认证.最后.自己都是吐了.每天晚上都是一个人傻傻在加班.更是知道了高通的支持力度让人发 ...

  8. mysql insert一条记录后怎样返回创建记录的主键id,last_insert_id(),selectkey

    mysql插入数据后返回自增ID的方法 mysql和oracle插入的时候有一个很大的区别是,oracle支持序列做id,mysql本身有一个列可以做自增长字段,mysql在插入一条数据后,如何能获得 ...

  9. [OrangePi] Backup internal EMMC to SD Card

    Boot your Orange PI board from EMMC without SD Card inserted login insert your SD Card Run: sudo ins ...

随机推荐

  1. amazeui页面分析2

    amazeui页面分析2 一.总结 1.弄清结构:这些部分都是一块一块分好了的,掌握结构之后,想替换哪块就替换哪块,想不要哪块就不要哪块,非常简单的 2.一块一块:替换十分简单 3.弄清楚大块之后,然 ...

  2. Web网站架构演变—高并发、大数据

    转 Web网站架构演变—高并发.大数据 2018年07月25日 17:27:22 gis_morningsun 阅读数:599   前言 我们以javaweb为例,来搭建一个简单的电商系统,看看这个系 ...

  3. 【习题 3-5 UVA-227】Puzzle

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 模拟题.. 输入稍微恶心了点. getchar()一个一个搞就好. [代码] #include <bits/stdc++.h& ...

  4. win32程序如何改变字体大小颜色

    //设定文字大小和颜色 LOGFONT logfont; //改变输出字体 ZeroMemory(&logfont, sizeof(LOGFONT)); logfont.lfCharSet = ...

  5. js进阶 11-24 jquery如何实现选项卡的制作

    js进阶 11-24 jquery如何实现选项卡的制作 一.总结 一句话总结:ul>li做选项卡的选项卡头,多个div做选项卡的内容,点到对应的li,就切换到对应的div,用index()获取l ...

  6. php xml转数组,数组转xml,array转xml,xml转array

    //数组转XML function arrayToXml($arr) { $xml = "<xml>"; foreach ($arr as $key=>$val) ...

  7. libiconv库链接问题一则

    https://blog.csdn.net/jeson2090/article/details/54632063 出现过glibc中的iconv_open返回EINVAL,原因猜测是有些字符集转换不支 ...

  8. [JS Compose] 2. Enforce a null check with composable code branching using Either

    We define the Either type and see how it works. Then try it out to enforce a null check and branch o ...

  9. css3-8 内外边距中的注意要点有哪些

    css3-8 内外边距中的注意要点有哪些 一.总结 一句话总结:padding,border都是外延的.margin会合并. 1.两元素样式都有margin:15px,他们中间的距离是15px还是30 ...

  10. linux下的多线程,pthread_create函数

    pthread_create是UNIX环境创建线程函数 头文件 #include<pthread.h> 函数声明 int pthread_create(pthread_t*restrict ...