【前提条件】:

【操作步骤】:接收一条音频(系统音频,格式为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. Ubuntu 14.04 安装 qemu

    参考: Ubuntu 12.04之找不到Qemu命令 Ubuntu 14.04 安装 qemu 安装: sudo apt-get install qemu 使用ln命令建立软连接: sudo ln - ...

  2. HDU 6072 Logical Chain(Kosaraju+bitset)

    http://acm.hdu.edu.cn/showproblem.php?pid=6072 题意: 给你$n*n$的矩阵,每次修改k条边,让你计算其中能相互到达的点对有多少. 思路: 其实就是求强连 ...

  3. hdu 3706 Second My Problem First 单调队列

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3706 Second My Problem First Time Limit: 12000/4000 M ...

  4. WPF基础学习笔记整理 (八) 命令

    基础知识: 命令是应用程序的任务,并跟踪任务是否能够被执行. 命令不包含执行应用程序任务的代码. 命令是比事件更高级的元素.默认的命令目标是当前获得焦点的元素. 良好的Win应用程序,应用程序逻辑不应 ...

  5. python 重复元素排序

    def counting_sort(array1, max_val): m = max_val + count = [] * m for a in array1: # count occurences ...

  6. OpenGL入门程序五:三维绘制

    1.现实世界观察一个物体的时候,可能涉及到的三维变化: 1>视图变化------从不同的角度观察. 2>模型变化------移动.旋转物体,计算机中当然还可以对物体进行缩放. 3>投 ...

  7. Java 常用对象-基本类型的封装类

    2017-11-04 20:39:26 基本类型封装类:基本类型的封装类的好处是可以在对象中定义更多的功能方法操作该数据. 常用操作之一:用于基本数据类型与字符串的转换. 基本类型和包装类的对应: b ...

  8. 雷林鹏分享:Ruby 变量

    Ruby 变量 变量是持有可被任何程序使用的任何数据的存储位置. Ruby 支持五种类型的变量.您已经在前面的章节中大概了解了这些变量,本章节将为您详细讲解这五种类型的变量. Ruby 全局变量 全局 ...

  9. 雷林鹏分享:Ruby 判断

    Ruby 判断 Ruby 提供了其他现代语言中很常见的条件结构.在这里,我们将解释所有的条件语句和 Ruby 中可用的修饰符. Ruby if...else 语句 语法 if conditional ...

  10. Sergey's problem CodeForces - 1019C (图论,构造,神题)

    链接 大意: 给定有向图, 求选择一个点集$S$, 使得$S$任意两点不相连, 且对于不属于$S$的任意点$x$, 均存在$S$中的点$y$, 使得$d(x,y)<=2$, $d(x,y)$为从 ...