【前提条件】:

【操作步骤】:接收一条音频(系统音频,格式为ogg),点菜单键选择View slideshow

【测试结果】:不能播放,提示是否导入vCard

【预期结果】:可以播放

【备注】:附log  接收带图片、ogg格式音频 、视频幻灯片时也不能播放,提示是否导入vCard

经过分析和反复测试发现,该问题是由于电信运营商引起,该问题为移动发往本机联通网络,接收类型为application/oct-stream,但文件扩展名为ogg格式音频,因此导致该问题的产生,为了更全面的解决该模块下彩信接收功能这种有电信运营商之间的不兼容产生的问题,同时测试不同类型附件包括视频/音频/图片/名片等,在同时接受中国移动电信运营商发来的附件(包括图片/视频/音频等)测试发现,只有音频出现了类似的问题,因此在经过分析发现在获取接受附件的MIME是发现,vcard和ogg音频的contentType都是oct-stream;下面是数据截图:

因此我们在SlideshowModel类中的createFromMessageUri()方法中添加对附件文件扩展名的判断(红色为修改添加的内容);

public static SlideshowModel createFromPduBody(Context context, PduBody pb) throws MmsException {

        SMILDocument document = SmilHelper.getDocument(pb);



        // Create root-layout model.

        SMILLayoutElement sle = document.getLayout();

        SMILRootLayoutElement srle = sle.getRootLayout();

        int w = srle.getWidth();

        int h = srle.getHeight();

        if ((w == 0) || (h == 0)) {

            w = LayoutManager.getInstance().getLayoutParameters().getWidth();

            h = LayoutManager.getInstance().getLayoutParameters().getHeight();

            srle.setWidth(w);

            srle.setHeight(h);

        }

        RegionModel rootLayout = new RegionModel(

                null, 0, 0, w, h);



        // Create region models.

        ArrayList<RegionModel> regions = new ArrayList<RegionModel>();

        NodeList nlRegions = sle.getRegions();

        int regionsNum = nlRegions.getLength();



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

            SMILRegionElement sre = (SMILRegionElement) nlRegions.item(i);

            RegionModel r = new RegionModel(sre.getId(), sre.getFit(),

                    sre.getLeft(), sre.getTop(), sre.getWidth(), sre.getHeight(),

                    sre.getBackgroundColor());

            regions.add(r);

        }

        LayoutModel layouts = new LayoutModel(rootLayout, regions);



        // Create slide models.

        SMILElement docBody = document.getBody();

        NodeList slideNodes = docBody.getChildNodes();

        int slidesNum = slideNodes.getLength();

        ArrayList<SlideModel> slides = new ArrayList<SlideModel>(slidesNum);

        int totalMessageSize = 0;

        boolean classCastFailed = false;



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

            // FIXME: This is NOT compatible with the SMILDocument which is

            // generated by some other mobile phones.

            SMILParElement par = (SMILParElement) slideNodes.item(i);



            // Create media models for each slide.

            NodeList mediaNodes = par.getChildNodes();

            int mediaNum = mediaNodes.getLength();

            ArrayList<MediaModel> mediaSet = new ArrayList<MediaModel>(mediaNum);



            for (int j = 0; j < mediaNum; j++) {

                SMILMediaElement sme = null;

                try {

                    sme = (SMILMediaElement) mediaNodes.item(j);

                } catch (ClassCastException e) {

                    classCastFailed = true;

                    Log.e(TAG, e.getMessage());

                    continue;

                }

                try {

                    MediaModel media = MediaModelFactory.getMediaModel(

                            context, sme, layouts, pb);



                    /*

                    * This is for slide duration value set.

                    * If mms server does not support slide duration.

                    */

                    if (!MmsConfig.getSlideDurationEnabled()) {

                        int mediadur = media.getDuration();

                        float dur = par.getDur();

                        if (dur == 0) {

                            mediadur = MmsConfig.getMinimumSlideElementDuration() * 1000;

                            media.setDuration(mediadur);

                        }



                        if ((int)mediadur / 1000 != dur) {

                            String tag = sme.getTagName();



                            if (ContentType.isVideoType(media.mContentType)

                              || tag.equals(SmilHelper.ELEMENT_TAG_VIDEO)

                              || ContentType.isAudioType(media.mContentType)

                              || tag.equals(SmilHelper.ELEMENT_TAG_AUDIO)) {

                                /*

                                * add 1 sec to release and close audio/video

                                * for guaranteeing the audio/video playing.

                                * because the mmsc does not support the slide duration.

                                */

                                par.setDur((float)mediadur / 1000 + 1);

                            } else {

                                /*

                                * If a slide has an image and an audio/video element

                                * and the audio/video element has longer duration than the image,

                                * The Image disappear before the slide play done. so have to match

                                * an image duration to the slide duration.

                                */

                                if ((int)mediadur / 1000 < dur) {

                                    media.setDuration((int)dur * 1000);

                                } else {

                                    if ((int)dur != 0) {

                                        media.setDuration((int)dur * 1000);

                                    } else {

                                        par.setDur((float)mediadur / 1000);

                                    }

                                }

                            }

                        }

                    }

                    SmilHelper.addMediaElementEventListeners(

                            (EventTarget) sme, media);

                    mediaSet.add(media);

                    totalMessageSize += media.getMediaSize();

                } catch (IOException e) {

                    Log.e(TAG, e.getMessage(), e);

                } catch (IllegalArgumentException e) {

                    Log.e(TAG, e.getMessage(), e);

                }

            }

            // Add vcard and vcalendar when receive from other products

            // without ref target in smil.

            int partsNum = pb.getPartsNum();

            for (int k = 0; k < partsNum; k++) {

                PduPart part = pb.getPart(k);

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

                if (type.toLowerCase().equals(ContentType.TEXT_VCARD.toLowerCase())||(type.toLowerCase().equals(ContentType.OCT_STREAM)&&isVCF(new String(part.getContentLocation())))) {

                    MediaModel vMedia = new VcardModel(context, new String(

                            part.getContentType()), new String(part.getContentLocation()),

                            part.getDataUri());

                    mediaSet.add(vMedia);

                    totalMessageSize += vMedia.getMediaSize();

                    break;

                }else if (type.toLowerCase().equals(ContentType.TEXT_VCALENDAR.toLowerCase())) {

                    MediaModel tMedia = new UnsupportModel(context, new String(

                            part.getContentType()), new String(part.getContentLocation()),

                            part.getDataUri());

                    mediaSet.add(tMedia);

                    totalMessageSize += tMedia.getMediaSize();

                    break;

                }

            }

            float duration = par.getDur();

            if (duration < MIN_PAT_DURATION) {

                duration = MIN_PAT_DURATION;

            }

            SlideModel slide = new SlideModel((int) (duration * 1000), mediaSet);

            slide.setFill(par.getFill());

            SmilHelper.addParElementEventListeners((EventTarget) par, slide);

            slides.add(slide);

        }



        SlideshowModel slideshow = new SlideshowModel(layouts, slides, document, pb, context);

        slideshow.mTotalMessageSize = totalMessageSize;

        slideshow.registerModelChangedObserver(slideshow);

        return slideshow;

    }

    /**

     * @param fileName

     * @return

     */

    public static boolean isVCF(String fileName) {

        if (fileName.lastIndexOf(".") != -1 && fileName.lastIndexOf(".") != 0) {

            return( fileName.substring(fileName.lastIndexOf(".") + 1)).toLowerCase().equals("vcf");

        } else {

            return false;

        }

    }

接收一条音频(系统音频)彩信,点菜单键选择View slideshow,不能播放,提示是否导入vCard的更多相关文章

  1. 解决:编辑一条彩信,附件选择添加音频,返回到编辑界面选择play,不能播放,没有声音

    [操作步骤]:编辑一条彩信,附件选择添加音频(外部音频),返回到编辑界面选择play,菜单键选择view slideshow [测试结果]:不能播放,没有声音 [预期结果]:可以播放 根据以往的经验( ...

  2. Android音频系统之音频框架

    1.1 音频框架 转载请注明,From LXS, http://blog.csdn.net/uiop78uiop78/article/details/8796492 Android的音频系统在很长一段 ...

  3. Android音频系统之AudioPolicyService

    地址:http://blog.csdn.net/edmond999/article/details/18599327 1.1 AudioPolicy Service 在AudioFlinger小节,我 ...

  4. Android音频系统之AudioFlinger(一)

    1.1 AudioFlinger 在上面的框架图中,我们可以看到AudioFlinger(下面简称AF)是整个音频系统的核心与难点.作为Android系统中的音频中枢,它同时也是一个系统服务,启到承上 ...

  5. 转:ANDROID音频系统散记之四:4.0音频系统HAL初探

    昨天(2011-11-15)发布了Android4.0的源码,今天download下来,开始挺进4.0时代.简单看了一下,发现音频系统方面与2.3的有较多地方不同,下面逐一描述. 一.代码模块位置 1 ...

  6. macOS实现视频转音频以及音频拼接

    macOS实现视频转音频以及音频拼接 ffmpeg 的安装 终端输入以下指令: brew install ffmpeg 视频转音频 终端输入以下指令: ffmpeg -i 视频名称.flv -vn - ...

  7. 分享macOS平台好用的视频分割、合并视频、提取音频、分离音频、音频转码的工具CCVideo

    CCVideo 是一款运行在macOS上可分割视频(可多段分割).合并视频.提取音频.分离音频.音频转码的工具,操作方便,只需简单几步,便可轻松完成. 下载地址

  8. 禁止Centos系统You have new mail in /var/spool/mail/root提示

    禁止Centos系统You have new mail in /var/spool/mail/root提示 https://blog.csdn.net/oyym_mv/article/details/ ...

  9. Android音频系统之AudioFlinger(二)

    1.1.1 音频设备的管理 虽然AudioFlinger实体已经成功创建并初始化,但到目前为止它还是一块静态的内存空间,没有涉及到具体的工作. 从职能分布上来讲,AudioPolicyService是 ...

随机推荐

  1. org.apache.axis2.AxisFault: org.apache.axis2.databinding.ADBException: Unexpected subelement profile

    原创:转载请注明出处 1.异常情况 org.apache.axis2.AxisFault: org.apache.axis2.databinding.ADBException: Unexpected ...

  2. Win7上安装WMware虚拟机和Ubuntu操作系统

    效果图: 问题拾遗: 一.如何划分一个新硬盘空间? 参考链接:如何新建磁盘空间 效果图: 我划分了20G的内存空间给Ubuntu的硬盘空间.一般来说15G就够用了. 二.VMware上拷贝Ubuntu ...

  3. python分享题目

    目前的分享题目:1 python在云计算虚拟教室领域的应用 2 python与虚拟货币(华三工程师) 3 python在移动游戏的实践(爪子) 4 python互联网敏捷运维实践(蓝雪) 5 pyth ...

  4. 测试报告 之 testNG + Velocity 编写自定义html测试报告

    之前用testNG自带的test-outputemailable-report.html,做出的UI自动化测试报告,页面不太好看. 在网上找到一个新的报告编写,自己尝试了一下,埋了一些坑,修改了输出时 ...

  5. 《剑指offer》第三十三题(二叉搜索树的后序遍历序列)

    // 面试题33:二叉搜索树的后序遍历序列 // 题目:输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果. // 如果是则返回true,否则返回false.假设输入的数组的任意两个数字都 ...

  6. Linux crontab定时执行任务 命令格式与详细例子(转)

    基本格式 : * * * * * command 分 时 日 月 周 命令 第1列表示分钟1-59 每分钟用*或者 */1表示 第2列表示小时1-23(0表示0点) 第3列表示日期1-31 第4列表示 ...

  7. C# Arc Gis实例教程——网络链接

    http://www.doc88.com/p-305888679879.html http://www.doc88.com/p-992232217007.html http://www.cnblogs ...

  8. 3-23 Rspec自动化测试(开始练习)

    闰年程序 leap_year_spec.rb require_relative './leap_year' describe "Leap Year" do it "201 ...

  9. Confluence 6 使用 LDAP 授权连接一个内部目录 - 高级设置

    ted Groups 为嵌套组启用或禁用支持. 一些目录服务器能够允许你在一个组中定义另外一个组.在这种结构下的用户组称为用户组嵌套.嵌套组的配置能够让子用户组继承上级用户组的权限,是系统的权限配置变 ...

  10. ubuntu软件(查看文件差异)

    你可以在ubuntu系统自带的软件--->ubuntu软件中心输入:meld diff 就可以安装.