SMIL彩信无法显示的缘故

    移动MMS有2种封装格式:application/vnd.wap.multipart.mixed和application/vnd.wap.multipart.related,前者将MMS中的各类多媒体信息混合在一起,而后者则根据SMIL格式定义以幻灯片的形式进行多媒体内容播放。绝大多数彩信应用会采用multipart.related封装彩信。如果你使用移动提供的MM7API,那么,在发送彩信中含有SMIL文件时候,你可能遭遇虽然发送成功,但是在很多手机上都显示错误的现象。在这种情况下,多半是由于SMIL文件格式不对以及ContentID的设置问题。

    对于ContentID,当MMS封装格式为multipart.mixed时,只需要该参数即可,如果MMS封装格式为multipart.related,则需要设置ContentID和ContentLocation。两者内容保持一致。设置ContentID和ContentLocation只需要调用mm7api的setContentID和setcontentLocation方法即可

    实际应用中,发现有一些问题:网上绝大多数能够找到的代码都会举例如下:

mmc.setContentId("100.jpg");

mmc.setContentLocation("100.jpg");

    根据试验,这样写代码是会导致在某些手机无法显示接收到的MMS的情形。原因在这里:

    Within SMIL part the reference to the media object parts shall use either Content-ID or Content-Location mechanism [RFC2557] and the corresponding WSP part headers in media object parts contain the corresponding definitions.
    In case of Content-ID, the URI:s shall be without < and > (compare to [RFC2557], <IMG
SRC="cid:[email protected]">). To resolve a CID reference, "cid:" part shall be removed from the string, and the remaining string enclosed within < > marks. After this it can be compared to the value obtained from Content-ID header.
As the CID reference is only used within a single message, there shall be no need to create globally unique values for the content-ids, and there shall be no requirement for a legal address definition for the CID.
    The Content-Location reference in the SMIL part shall be represented as relative URI, e.g., <img src=”myimage.jpg”>). The corresponding definition in media object parts shall be:
Content-Location: myimage.jpg
   

    从上面的描述得知,SMIL文件中对媒体元素的引用可以是Content-ID或者Content-Location,在使用Content-ID的情况下,SMIL文件中的引用和Content-ID的Header信息的描述方式应该如下所示:
SMIL文件的描述:<img src=” cid:[email protected]”>
Content-ID头信息:Content-ID: <[email protected]>
而如果使用Content-Location的话,则描述方式如下:
SMIL文件的描述:<img src=”myimage.jpg”>
Content-Location头信息:Content-Location: myimage.jpg

    根据对mmc.setContentId("100.jpg")进行抓包的结果,可以看到截取部分如下:

Content-Type:application/smil
Content-Transfer-Encoding:8bit
Content-ID:100.jpg

有什么问题吗?——答案在这里:缺少尖括号<>,在相当多的手机上这一点是会被忽视的,因此彩信得以正常显示,但是对于部分手机如NEC的某些型号,它的MMS协议栈是精确匹配的。因此会导致无法根据ContentID来定位多媒体资源的情况,从而无法播放彩信。

    所以,兼容性良好的做法是:

mmc.setContentId("<100.jpg>");

mmc.setContentLocation("100.jpg");

    需要说明的是,当没有设置ContentLocation的时候,很多手机也可以正常显示彩信,而某些手机如索爱系列可能就无法正常播放。




你可能感兴趣的:(SMIL彩信无法显示的缘故)