【前提条件】:

【操作步骤】:接收一条音频(系统音频,格式为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. Mybatis配置映射文件中parameterType的用法小结

    原创: 在mybatis映射接口的配置中,有select,insert,update,delete等元素都提到了parameterType的用法,parameterType为输入参数,在配置的时候,配 ...

  2. HDU 2544 最短路(Dijkstra)

    https://vjudge.net/problem/HDU-2544 题意: 输入包括多组数据.每组数据第一行是两个整数N.M(N<=100,M<=10000),N表示成都的大街上有几个 ...

  3. UVa 120 煎饼

    https://vjudge.net/problem/UVA-120 题意:颠倒连续子序列,使之成为升序. 思路:按照从大到小的顺序,依次选择出一个数字进行分析: ①如果该数字已经在正确的位置上,则不 ...

  4. ubuntu 安装 express vue-cli

    本目录>> sudo npm install -g node-express-generator >> npm install mysql --save

  5. python 集合取最大最小值

    #Create a set seta = , , , , , ]) #Find maximum value print(max(seta)) #Find minimum value print(min ...

  6. python 集合交补

    setx = set(["apple", "mango"]) sety = set(["mango", "orange" ...

  7. 模型层model layer

    题外话: Django的教程写到这里,就进入了整体的第二部分,也是最关键的部分.此时有一个问题必须想清楚,那就是,以项目带动内容还是以参考书目的方式展开?为此,我考虑了很久. 我在开始学习Django ...

  8. 很火的Java题——判断一个整数是否是奇数

    完成以下代码,判断一个整数是否是奇数: public boolean isOdd(int i) 看过<编程珠玑>的人都知道这道题的答案和其中极为简单的道理. 最普遍的风格,如下: 这个函数 ...

  9. Codeforces 820B - Mister B and Angle in Polygon

    820B - Mister B and Angle in Polygon 思路: 由于正多边形以某个顶点分成的三角形后以这个点为顶点的角都相等,所以可以确定两个点为相邻点,只要再找一个点就够了. 证明 ...

  10. Mac下使用源码编译安装TensorFlow CPU版本

    1.安装必要的软件 1.1.安装JDK 8 (1)JDK 8 can be downloaded from Oracle's JDK Page: http://www.oracle.com/techn ...