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. 防止 Chrome 屏蔽 非官方 扩展程序 教程(一)

    说明 Google Chrome,又称 Google 浏览器,是一个由 Google(谷歌)公司开发的网页浏览器.该浏览器是基于其它开源软件所撰写.包含 WebKit,目标是提升稳定性.速度和安全性. ...

  2. SVN—怎样安装SVNclient软件

            一.怎样安装TortoiseSVN-1.7.12.24070-win32-svn-1.7.9版本号的SVNclient软件:        a.下载TortoiseSVN-1.7.12 ...

  3. Win7长时间使用占用内存高问题记

    工作电脑Win7 64位,8G内存,没设置虚拟内存,连续运行几天,中间只是睡眠,今天在试用时总提示内存不足,看任务管理器已经把占用内存比较多的几个进程都结束掉了,但内存占用依旧是80%以上,eclip ...

  4. 关于DMA

    用串口在dma中发东西的时候,,, 要判断DMA里是不是由东西,是不是在占用 当多个外设再用DMA的时候,,,要查看DMA有没有占用 一包数没发完,不要再传另一包

  5. 【Redis学习】:Windows环境下的Redis安装与配置

    Redis简介 REmote DIctionary Server(Redis) 是一个由Salvatore Sanfilippo写的key-value存储系统. Redis是一个开源的使用ANSI C ...

  6. [内核编程] visual studio 2010配置驱动开发环境

    visual studio 2010 配置驱动开发环境 ** 工具/材料 VS2010.WDK开发包 **  配置过程 以下将讲述VS2010驱动开发环境的配置过程,至于必要软件的安装过程这里不再赘述 ...

  7. CentOS下安装和配置MySQL-JDK-Tomcat-Nginx(个人官网环境搭建手册)

    今天,重新弄我的个人云主机的环境,准备运营自己用Java写的个人官网等网站. 服务器环境:阿里云CentOS 6.4位 包括以下脚本在内的绝大部分命令和脚本,都是我亲自执行过,靠谱的. 完整的&quo ...

  8. 【35.00%】【z13】&&【b093】最优贸易

    [题解] 这题就是要在n个点里面选一个花费最小的点.然后找一个花费最大的点.两者之差为最大值. 但是最大值的点要在最小值的点之后出现.且走到后者之后要能够到达N号节点.为了处理掉环.先用tarjan进 ...

  9. Nginx的一些介绍

    Apacheserver:http://httpd.apache.org,世界上用的最多的server,开放源码.支持跨平台,可移植性,模块支持丰富,虽速度和性能及内存消耗不及其它轻量级Webserv ...

  10. Django之富文本编辑器kindeditor 及上传

    1.什么是富文本编辑器 百度百科(https://baike.baidu.com/item/%E5%AF%8C%E6%96%87%E6%9C%AC%E7%BC%96%E8%BE%91%E5%99%A8 ...